zrzut heksowy a rzeczywista zawartość pliku

16

Kiedy to zrobię hexdump filename.txt, otrzymuję następujące dane wyjściowe:

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

Kiedy to zrobię <?= bin2hex(file_get_contents('filename.txt')); ?>, dostaję to:

5aacfb5a8dc0155dd0269124c9e81789

Dlaczego więc zrzut heksowy sugeruje, że zawartość powinna być, ac5a5afbc08d5d1526d02491e8c98917gdy PHP sugeruje, że powinna być 5aacfb5a8dc0155dd0269124c9e81789? Czy po prostu nie interpretuję poprawnie wyniku zrzutu heksadecymalnego?

neubert
źródło

Odpowiedzi:

24

Różnica polega na porządku big-endian vs. little-endian .

Start z pierwszych czterech bajtów wyjściu zrzutu heksowego: ac5a 5afb. Teraz przełącz kolejność bajtów, aby uzyskać:

5aac fb5a

Porównaj to z wyjściem PHP:

5aac fb5a

Pasują do siebie.

Domyślnie BSD hexdumpwyświetla dane wyjściowe na podstawie endianizmu maszyny. Jeśli nie chcesz, możesz określić -Copcję uzyskiwania danych wyjściowych bajt po bajcie zamiast słowo po słowie:

$ 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
źródło
4
Aby dodać nieco: hexdump pokazuje dane interpretowane jako szesnastobitowe słowa. bin2hex pokazuje jeden bajt na raz, co byłoby odpowiednie dla znaków ASCII lub podobnych. W procesorach x86 i x64 (i innych procesorach little-endian) pierwszy bajt liczby całkowitej wielobajtowej zawiera najmniej znaczące bity. Więc jeśli pierwszą rzeczą w twoim pliku była 16-bitowa liczba całkowita zawierająca wartość 1, wyświetlenie jej jako bajtów oznaczałoby 01 00, ale wyświetlenie jej jako 16-bitowego słowa oznaczałoby 0001 (naturalna kolejność odczytu, LSB po prawej stronie, jak w codziennym użyciu liczb dziesiętnych). en.wikipedia.org/wiki/Endianness
Jamie Hanrahan
Aby dodać komentarz @ JamieHanrahan, przeczytaj: „i wszystkie inne procesory little-endian”, ponieważ jest to sedno endianizmu.
glglgl