функция распаковки не дает аналогичного результата - PullRequest
3 голосов
/ 08 января 2012

У меня есть бинарный файл, и для получения содержимого я использовал функцию «распаковать».

Мой скрипт может работать как для 32-битного, так и для 64-битного exe Поэтому я использовал следующий код:

if ( $ENV{PROCESSOR_ARCHITECTURE} eq 'x86' )
{
    @data = unpack( "LL8", $binary );
} 
else 
{
    @data = unpack( "Q8", $binary );
} 
    print Dumper \@data;  

Но когда я выполняю одно и то же с использованием 32-битного Active Perl и 64-битного активного Perl-компилятора, я получаю разные результаты:

32-бит:

$ VAR1 = [ 129864071, 0, 47193587, 0, 16448777, 0, 41067198, 0, 129 ];

64 бит:

$ VAR1 = [ 129864071, 47193587, 16448777, 41067198, 129, 365173507, 25208052, 152155982 ]

В чем может быть причина этой разницы? Как я могу сделать их похожими, все еще используя 32-битные беззнаковые длинные и 64-битные беззнаковые четырехугольные значения?

1 Ответ

6 голосов
/ 08 января 2012

Спецификация LL8 означает «распаковать 9 беззнаковых 32-битных величин».

Спецификация Q8 означает «распаковать 8 неподписанных 64-битных количеств».

Неудивительно, что вы получаете разные результаты, так как вы запрашиваете разные результаты.

Полагаю, вы можете использовать L16 (или (LL)8, хотя конечный результат тот же), если вы хотите распаковать 512 бит данных.

...