hexdump против фактического содержимого файла

16

Когда я hexdump filename.txtполучаю следующее как вывод:

00000000 ac5a 5afb c08d 5d15 26d0 2491 e8c9 8917
00000010 

Когда я <?= bin2hex(file_get_contents('filename.txt')); ?>получаю это:

5aacfb5a8dc0155dd0269124c9e81789

Так почему hexdump предполагает, что содержимое должно быть, ac5a5afbc08d5d1526d02491e8c98917когда PHP предполагает, что оно должно быть 5aacfb5a8dc0155dd0269124c9e81789? Я просто не правильно интерпретирую вывод hexdump?

Нойберт
источник

Ответы:

24

Разница между порядком байтов и порядком байтов .

Начнем с первых четырех байт вывода шестнадцатеричного: ac5a 5afb. Теперь переключите порядок байтов, чтобы получить:

5aac fb5a

Сравните это с выводом PHP:

5aac fb5a

Они совпадают.

По умолчанию BSD hexdumpотображает вывод на основе порядкового номера машины. Если вы не хотите этого, вы можете указать -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
John1024
источник
4
Чтобы добавить немного: hexdump показывает данные, интерпретируемые как шестнадцати-битные слова. bin2hex показывает один байт за раз, что будет подходящим для символов ASCII или аналогичных. В x86 и x64 (и других процессорах с прямым порядком байтов) первый байт многобайтового целого числа содержит младшие значащие биты. Таким образом, если первым в вашем файле было 16-разрядное целое число, содержащее значение 1, то его отображение в виде байтов показывало бы 01 00, а отображение в виде 16-разрядного слова показывало бы 0001 (естественный порядок чтения, LSB справа, как мы делаем в повседневном использовании десятичных чисел). en.wikipedia.org/wiki/Endianness
Джейми Ханрахан
Чтобы добавить комментарий @ JamieHanrahan, прочитайте: «и все остальные процессоры с прямым порядком байтов», так как это и есть точка байтов.
glglgl