dil: (Default)
dil ([personal profile] dil) wrote2008-12-26 08:49 pm

красивые грабли, с ручкой, украшенной лепниной (C) dma

Задача: прочитанные их файла байтики разобрать на отдельные биты. На перле.
Пишем простенькую тестовую программу:
#!/usr/bin/perl -w

my $foo = "\x47";

for(my $i=7;$i>=0;$i--){
print vec($foo, $i, 1)." ";
}
print "\n";


Получаем ожидаемое 0 1 0 0 0 1 1 1.

Поскольку байтиков ожидается больше одного, усложняем пример. Разбираем буфер на отдельные байты в массив:
my @a = unpack("C*", $foo);

проверяем, что получилось:
printf("0x%x\n", $a[0]);
(даёт 0x47, как и ожидалось)

и повторяем процедуру извлечения битов:
for(my $i=7;$i>=0;$i--){
print vec($a[0], $i, 1)." ";
}
print "\n";

и.. получаем другой результат: 0 0 1 1 0 1 1 1

Долго бьёмся головой об стену в тщетных попытках понять, почему три бита из восьми инвертировались.


работает, если vec() применять к chr($a[0]) или если unpack делать с A*

Спасибо [livejournal.com profile] dma, а то бы я голову разбил.

[identity profile] http://users.livejournal.com/mak_/ 2008-12-27 03:30 am (UTC)(link)
(не вникая в вопрос)мммм... а что, перл что-то гарантировал?

[identity profile] tejblum.livejournal.com 2008-12-27 08:10 am (UTC)(link)
Не совсем понимаю, что такое "гарантии", однако о том, что функция vec ведет себя именно так, написанно в ее документации, причем в самом начале (если ее внимательно читать).

[identity profile] dil.livejournal.com 2008-12-27 12:35 pm (UTC)(link)
ага. только при этом надо постоянно помнить про автоматические преобразования целых чисел в строки и обратно. кто ж знал, что C - это не строка..

[identity profile] tejblum.livejournal.com 2008-12-27 01:25 pm (UTC)(link)
Все же, если оно через printf "0x%x" печатается как 0x47, то наверное это число 0x47, а не строка "\x47".

Меня в свое время в перле глубоко впечатлил тот факт, что
   foo(bar("baz"))
и
   my $x = bar("baz");
   foo($x)
-- разные вещи, и от замены второго на первое программа вполне может сломаться. Головой об стенку не бился, но впечатление было сильным.

[identity profile] dil.livejournal.com 2008-12-27 01:37 pm (UTC)(link)
потому что там ещё есть понятие контекста, скалярного или векторного..

[identity profile] tejblum.livejournal.com 2008-12-27 01:44 pm (UTC)(link)
Во-во, точно. Напридумывали фичей для удобства, блин.

[identity profile] dil.livejournal.com 2008-12-27 12:35 pm (UTC)(link)
а я разве писал, что кто-то что-то гарантировал?