Perl包使用 - 双大端?

时间:2010-06-21 15:30:23

标签: perl binary endianness

根据此计算器网站(link text),将3从十进制转换为双精度时,我应该4008 0000 0000 0000

当使用Perl pack函数时,使用参数“d> *”,我希望在使用此函数时看到4008 0000 0000 0000

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

但是当我对Perl输出文件进行“hexdump”时,我看到0840 0000 0000 0000

我认为它可能属于大/小端,但在尝试小端时,

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

我明白了:0000 0000 0000 4008

如果我想从Perl 4008 0000 0000 0000输出中获得结果pack该怎么办?

顺便说一下,当使用“float”时 - 一切都像预期的那样有效。

1 个答案:

答案 0 :(得分: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