Использование пакета Perl - double big endian? - PullRequest
2 голосов
/ 21 июня 2010

Согласно этому сайту калькулятора ( текст ссылки ), при преобразовании 3 из десятичного в двойное, я должен получить 4008 0000 0000 0000.

При использовании Perl pack function, с параметром "d> *", я ожидал увидеть 4008 0000 0000 0000, поскольку я использую эту функцию:

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

Но когда я "hexdump" к выходному файлу Perl, я вижу 0840 0000 0000 0000.

Я думал, что он может принадлежать к старому / младшему порядковому порядку, но при попытке использовать младший порядковый номер,

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

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

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

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

1 Ответ

4 голосов
/ 21 июня 2010

Ваша интуиция относительно порядка байтов в 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
...