2010-06-21 2 views
2

В соответствии с этим калькулятором сайта (link text), при преобразовании 3 из дес в два раза я получаю 4008 0000 0000 0000Perl pack использовать - двойной большой endian?

При использовании функции Perl пакет, с параметром «D> *», я ожидал увидеть 4008 0000 0000 0000 как я использовать эту функция:

print $File pack("d>*",3); 

но когда я «HexDump» в выходной файл Perl, я вижу 0840 0000 0000 0000

Я думал, что она может принадлежать к большой/маленький Endian, но при попытке маленький Endian:

print $File pack("d<*",3); 

я получаю это: 0000 0000 0000 4008

Что оболочки мне делать, если я хочу, чтобы получить этот результат 4008 0000 0000 0000 из Perl выхода пакета?

Спасибо.

Кстати, при использовании «Float» - все работает так, как ожидалось.

ответ

4

Ваша интуиция относительно порядка байтов в Perl верна, но я думаю, что выход hexdump не означает, что вы думаете, что он делает. Похоже, что hexdump отображает каждую пару байтов в согласованном, но противоречивом порядке. Вот несколько экспериментов, которые вы можете выполнить, чтобы понять.

# bytes are stored in the order that they are printed 
$ perl -e 'print "\x{01}\x{02}\x{03}\x{04}"' | od -c 
0000000 001 002 003 004 
0000004 

# perl reads the bytes in the correct order  
$ perl -e 'print "\x{01}\x{02}\x{03}\x{04}"' | perl -ne 'print map{ord,$"}split//' 
1 2 3 4 

# but the way hexdump displays the bytes is confusing (od -h gives same output) 
$ perl -e 'print "\x{01}\x{02}\x{03}\x{04}"' | hexdump 
0000000 0201 0403 
0000004 
+0

Трубопроводы в 'hex' приводят к' 01 02 03 04'. Это версия из [esr] (http://catb.org/esr/software.html), а также в целом превосходит 'hexdump' из util-linux или' xxd'. – daxim

+0

OK, Perl все в порядке. Решение состоит в том, чтобы добавить «-C» в Hexdump: «hexdump -C [FileName]» покажет ожидаемые результаты. – YoDar