November 2019

S M T W T F S
      12
34 5 678 9
10111213141516
17181920212223
24252627282930

Style Credit

Expand Cut Tags

No cut tags
Friday, December 26th, 2008 08:49 pm
Задача: прочитанные их файла байтики разобрать на отдельные биты. На перле.
Пишем простенькую тестовую программу:
#!/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, а то бы я голову разбил.
Saturday, December 27th, 2008 12:35 pm (UTC)
а я разве писал, что кто-то что-то гарантировал?