hexdump 与实际文件内容

neu*_*ert 17 linux php hexdump

当我这样做时,hexdump filename.txt我得到以下输出:

00000000 ac5a 5afb c08d 5d15 26d0 2491 e8c9 8917
00000010 
Run Code Online (Sandbox Code Playgroud)

当我这样做时<?= bin2hex(file_get_contents('filename.txt')); ?>

5aacfb5a8dc0155dd0269124c9e81789
Run Code Online (Sandbox Code Playgroud)

那么为什么 hexdump 建议内容应该是ac5a5afbc08d5d1526d02491e8c98917,而 PHP 建议它们应该是5aacfb5a8dc0155dd0269124c9e81789呢?我只是没有正确解释 hexdump 的输出吗?

Joh*_*024 25

区别在于big-endian 与 little-endian order

从 hexdump 输出的前四个字节开始: ac5a 5afb. 现在切换字节顺序得到:

5aac fb5a
Run Code Online (Sandbox Code Playgroud)

将其与 PHP 输出进行比较:

5aac fb5a
Run Code Online (Sandbox Code Playgroud)

他们匹配。

默认情况下,BSDhexdump根据机器的字节顺序显示输出。如果您不希望那样,您可以指定-C选项以逐字节而不是逐字获取输出:

$ hexdump filename.txt 
0000000 ac5a 5afb c08d 5d15 26d0 2491 e8c9 8917
0000010
$ hexdump -C filename.txt 
00000000  5a ac fb 5a 8d c0 15 5d  d0 26 91 24 c9 e8 17 89  |Z..Z...].&.$....|
00000010
Run Code Online (Sandbox Code Playgroud)

  • 补充一点:hexdump 显示了解释为 16 位字的数据。bin2hex 一次显示一个字节,这适用于 ASCII 字符或类似字符。在 x86 和 x64(以及其他小端 CPU)上,多字节整数的第一个字节包含最低有效位。因此,如果文件中的第一件事是包含值 1 的 16 位整数,则将其显示为字节将显示 01 00 ,但将其显示为 16 位字将显示 0001 (自然阅读顺序,右侧的 LSB,正如我们在日常使用十进制数时所做的那样)。https://en.wikipedia.org/wiki/Endianness (4认同)