hexdump vs tatsächlichen Dateiinhalt

16

Wenn ich das tue, hexdump filename.txtbekomme ich folgendes als Ausgabe:

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

Wenn ich das tue, <?= bin2hex(file_get_contents('filename.txt')); ?>bekomme ich Folgendes:

5aacfb5a8dc0155dd0269124c9e81789

Warum schlägt hexdump vor, dass der Inhalt sein sollte, ac5a5afbc08d5d1526d02491e8c98917wenn PHP vorschlägt, dass er sein sollte 5aacfb5a8dc0155dd0269124c9e81789? Interpretiere ich die Ausgabe von hexdump einfach nicht richtig?

neubert
quelle
7
en.wikipedia.org/wiki/Endianness
ƬᴇcƬᴇιʜ007

Antworten:

24

Der Unterschied ist Big-Endian vs. Little-Endian .

Beginnen Sie mit den ersten vier Bytes von hexdump Ausgabe: ac5a 5afb. Schalten Sie nun die Bytereihenfolge um, um zu erhalten:

5aac fb5a

Vergleichen Sie dies mit der PHP-Ausgabe:

5aac fb5a

Sie passen.

Standardmäßig zeigt BSD hexdumpdie Ausgabe basierend auf der Endianität der Maschine an. Wenn Sie das nicht möchten, können Sie die -COption festlegen , dass die Ausgabe Byte für Byte und nicht Wort für Wort erfolgt:

$ 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
quelle
4
So fügen Sie ein Bit hinzu: hexdump zeigt die Daten als 16-Bit-Wörter an. bin2hex zeigt jeweils ein Byte an, wie es für ASCII-Zeichen oder ähnliches angemessen wäre. Auf x86- und x64-CPUs (und anderen Little-Endian-CPUs) enthält das erste Byte einer Multi-Byte-Ganzzahl die niedrigstwertigen Bits. Wenn das erste Element in Ihrer Datei eine 16-Bit-Ganzzahl mit dem Wert 1 wäre, würde bei der Anzeige als Byte 01 00 angezeigt, bei der Anzeige als 16-Bit-Wort jedoch 0001 (natürliche Lesereihenfolge, LSB rechts). wie wir es im alltäglichen Gebrauch von Dezimalzahlen tun). en.wikipedia.org/wiki/Endianness
Jamie Hanrahan
Um @ JamieHanrahans Kommentar hinzuzufügen, lesen Sie: "und alle anderen Little-Endian-CPUs", da dies der eigentliche Punkt der Endianness ist.
Glglgl