hexdump ve gerçek dosya içeriği


16

Ne zaman hexdump filename.txtçıktı olarak aşağıdakileri elde:

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

Ne zaman bunu <?= bin2hex(file_get_contents('filename.txt')); ?>elde:

5aacfb5a8dc0155dd0269124c9e81789

Peki neden hexdump ac5a5afbc08d5d1526d02491e8c98917PHP olması gerektiğini öne sürdüğünde içeriklerin olması gerektiğini öne sürüyor 5aacfb5a8dc0155dd0269124c9e81789? Hexdump çıktısını doğru yorumlamıyor muyum?


Yanıtlar:


24

Aradaki fark big-endian ve little-endian düzenidir .

HexDump çıktısının ilk dört bayt başlayın: ac5a 5afb. Şimdi almak için bayt sırasını değiştirin:

5aac fb5a

Bunu PHP çıktısıyla karşılaştırın:

5aac fb5a

Eşleşiyorlar.

Varsayılan olarak, BSD hexdumpçıktıyı makinenin endianitesine göre görüntüler. Bunu istemiyorsanız, -Ckelime kelime yerine bayt bayt alma seçeneğini belirleyebilirsiniz:

$ 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

4
Bir bit eklemek için: hexdump, on altı bit sözcük olarak yorumlanan verileri gösteriyor. bin2hex, ASCII karakterleri veya benzerleri için uygun olacağı gibi her seferinde bir bayt gösteriyor. X86 ve x64 (ve diğer küçük endian CPU'larda), çok baytlık bir tamsayının ilk baytı en az önemli bitleri içerir. Dosyanızdaki ilk şey 1 değerini içeren 16 bitlik bir tamsayıysa, bayt olarak görüntülemek 01 00'ı gösterir, ancak 16 bitlik bir kelime olarak görüntülemek 0001'i (doğal okuma sırası, sağdaki LSB, ondalık sayıların günlük kullanımında yaptığımız gibi). Indianness
Jamie Hanrahan

@ JamieHanrahan'ın yorumuna eklemek için şunu okuyun: "ve diğer tüm küçük endian işlemciler", çünkü bu endianitenin en önemli noktasıdır.
glglgl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.