Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 как собрать байты в число?   alexander lunyov   29 Feb 2008 20:37:45 
 Re: как собрать байты в число?   Artem Chuprina   02 Mar 2008 14:44:35 
 Re: как собрать байты в число?   alexander lunyov   12 Mar 2008 13:10:02 
 как собрать байты в число?   Dmitry E. Oboukhov   12 Mar 2008 13:56:17 
 Re: как собрать байты в число?   alexander lunyov   12 Mar 2008 15:47:24 
 как собрать байты в число?   Dmitry E. Oboukhov   12 Mar 2008 17:08:30 
Архивное /ru.perl/31437e32c5f21.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional