2012-01-08 2 views
3

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

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

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

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

32bit:

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

64 бит:

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

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

+0

Получил неосторожную ошибку, которую я здесь сделал --- Должен сказать, что @data = unpack ("(LL) 8", $ binary); Тогда я использую только 32 бита для интерпретации 64 бит. – Kallol

+0

Да, вы могли бы использовать спецификацию 8 'в скобках (LL). –

ответ

6

Спецификация LL8 означает «unpack 9 unsigned 32-bit quantity».

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

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

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