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

4
Щоб додати трохи: hexdump показує дані, інтерпретовані як шістнадцять бітних слів. bin2hex відображає по одному байті за часом, як це було б доречно для символів ASCII або подібних. На x86 та x64 (та інших процесорах малої ендіанських процесів) перший байт багатобайтового цілого числа містить найменш значущі біти. Отже, якщо першим ділом у вашому файлі було 16-бітове ціле число, що містить значення 1, відображення його як байти показало б 01 00, але відображення його як 16-бітове слово показувало б 0001 (природний порядок читання, LSB справа, як це робимо у повсякденному використанні десяткових чисел). en.wikipedia.org/wiki/Endianness
Джеймі Ханрахан

Щоб додати коментар до @ JamieHanrahan, прочитайте: "та всі інші процесори з малим ендіанським процесором", оскільки це саме суть ендіанства.
glglgl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.