hexdump vs konten file aktual

16

Ketika saya melakukannya hexdump filename.txtsaya mendapatkan yang berikut ini sebagai output:

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

Ketika saya melakukannya <?= bin2hex(file_get_contents('filename.txt')); ?>saya mendapatkan ini:

5aacfb5a8dc0155dd0269124c9e81789

Jadi mengapa hexdump menyarankan konten seharusnya ac5a5afbc08d5d1526d02491e8c98917ketika PHP menyarankan mereka seharusnya 5aacfb5a8dc0155dd0269124c9e81789? Apakah saya tidak menafsirkan output hexdump dengan benar?

neubert
sumber

Jawaban:

24

Perbedaannya adalah urutan big-endian vs little-endian .

Mulailah dengan empat byte pertama output hexdump: ac5a 5afb. Sekarang alihkan urutan byte untuk mendapatkan:

5aac fb5a

Bandingkan ini dengan output PHP:

5aac fb5a

Mereka cocok.

Secara default, BSD hexdumpmenampilkan output berdasarkan endianness mesin. Jika Anda tidak menginginkannya, Anda dapat menentukan -Copsi untuk mendapatkan output byte-by-byte daripada kata-demi-kata:

$ 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
sumber
4
Untuk menambahkan sedikit: hexdump menunjukkan data yang ditafsirkan sebagai kata enam belas-bit. bin2hex menunjukkan satu byte pada suatu waktu, seperti yang sesuai untuk karakter ASCII atau serupa. Pada x86 dan x64 (dan CPU little-endian lainnya), byte pertama dari integer multi-byte berisi bit paling tidak signifikan. Jadi, jika hal pertama dalam file Anda adalah bilangan bulat 16-bit yang berisi nilai 1, menampilkannya sebagai byte akan menunjukkan 01 00, tetapi menampilkannya sebagai kata 16-bit akan menunjukkan 0001 (urutan pembacaan alami, LSB di sebelah kanan, seperti yang kita lakukan dalam penggunaan angka desimal setiap hari). en.wikipedia.org/wiki/Endianness
Jamie Hanrahan
Untuk menambahkan komentar @ JamieHanrahan, baca: "dan semua CPU little-endian lainnya", karena ini adalah titik dari endianness.
glglgl