|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Artem Chuprina 2:5020/400 02 Mar 2008 14:44:35 To : alexander lunyov Subject : Re: как собрать байты в число? -------------------------------------------------------------------------------- alexander lunyov @ Fri, 29 Feb 2008 16:37:45 +0000 (UTC): al> есть бинарный файл с записями разной длины. хотел написать функцию, al> которая бы брала из файла столько байт сколько мне надо и al> конвертила их в число. до этого perl'ом бинарные файлы не разбирал al> и вот встрял. читал доки, рецепты.... нет, не понимаю. снимите с al> ручника. al> sub readfile al> { al> my $number = ""; al> my $buffer = ""; al> my $handle = shift; al> my $len_to_read = shift; al> sysread $handle,$buffer,$len_to_read; al> foreach (split(//,$buffer)) al> { al> printf("%02x ", ord($_)); al> } al> my @aa = unpack("C" x $len_to_read,$buffer); al> print " = "; al> foreach $i (@aa) { print $i," ";} al> print "\n"; al> } al> сама программа: al> open (FILE,$filename) or die "can't open file $filename\n"; al> binmode FILE; al> &readfile(FILE,1); al> &readfile(FILE,2); al> &readfile(FILE,4); al> получаю такую картину: al> c8 = 200 al> 00 4e = 0 78 al> 03 cb 9c 2f = 3 203 156 47 al> то есть каждый байт превращается в число. а как сделать чтобы все al> байты из одной партии стали числом? то есть чтобы 03 cb 9c 2f стало al> числом 63675439? можно их по-тупому перемножить последовательно, al> но я чувствую что можно всё сделать намного элегантнее. но не знаю al> как :( Сдается мне, что ты и по-русски-то толком задачу сформулировать не можешь. Потому и на перле не получается. Для начала надо понимать, что получить ты пытаешься не длинное число, которое может быть произвольной длины, а обычное. Обычное с точки зрения unpack бывает 8-битное (C), 16-битное (S, n или v в зависимости от требований к совместимости), 32-битное (L, N, V), и если повезет, 64-битное (оно только в native укладке). Есть еще такая хитрая штука, как w, но для нее число соответственно паковать надо. А вообще - perldoc perlpacktut до просветления... -- Artem Chuprina RFC2822: <ran{}ran.pp.ru> Jabber: ran@jabber.ran.pp.ru У кошки четыре ноги: ввод, вывод, земля и питание. --- ifmail v.2.15dev5.4 * Origin: Leninsky 45 home network (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/31437e32c5f21.html, оценка из 5, голосов 10
|