hexdump vs conteúdo real do arquivo

16

Quando eu hexdump filename.txtrecebo o seguinte como saída:

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

Quando eu <?= bin2hex(file_get_contents('filename.txt')); ?>recebo isso:

5aacfb5a8dc0155dd0269124c9e81789

Então, por que o hexdump sugere que o conteúdo deveria estar ac5a5afbc08d5d1526d02491e8c98917quando o PHP está sugerindo que deveria 5aacfb5a8dc0155dd0269124c9e81789? Não estou interpretando corretamente a saída do hexdump corretamente?

Neubert
fonte

Respostas:

24

A diferença é ordem big-endian vs. little-endian .

Comece com os primeiros quatro bytes de saída hexdump: ac5a 5afb. Agora mude a ordem dos bytes para obter:

5aac fb5a

Compare isso com a saída do PHP:

5aac fb5a

Eles combinam.

Por padrão, o BSD hexdumpexibe a saída com base na resistência da máquina. Se você não quiser isso, pode especificar a -Copção de obter saída byte a byte e palavra por palavra:

$ 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
fonte
4
Para adicionar um bit: hexdump está mostrando os dados interpretados como palavras de dezesseis bits. O bin2hex está mostrando um byte de cada vez, como seria apropriado para caracteres ASCII ou similares. Em x86 e x64 (e outras CPUs little-endian), o primeiro byte de um número inteiro de vários bytes contém os bits menos significativos. Portanto, se a primeira coisa em seu arquivo fosse um número inteiro de 16 bits contendo o valor 1, exibi-lo como bytes mostraria 01 00, mas exibi-lo como uma palavra de 16 bits mostraria 0001 (ordem de leitura natural, LSB à direita, como fazemos no uso diário de números decimais). en.wikipedia.org/wiki/Endianness
Jamie Hanrahan
Para adicionar o comentário de @ JamieHanrahan, leia: "e todas as outras CPUs little-endian", pois esse é o ponto exato da endianness.
glglgl