Gibt es ein Dienstprogramm wie Hexdump, das nicht-native Endian-Ness behandelt?

3214
EHN

Hexdumps Fähigkeit, binäre Daten zu lesen und sie entsprechend zu formatieren, damit sie beispielsweise an awk weitergeleitet werden können, ist sehr nützlich, aber ich muss regelmäßig Dateien lesen, in denen die binären Daten einen anderen Endianer haben als das systemeigene System . Insbesondere muss ich Big-Endian-Daten auf einer Little-Endian-Maschine lesen. Meine ideale Lösung wäre "Hexdump" mit einem Schalter, um die Endianität umzukehren, aber ein solcher Schalter scheint nicht zu existieren.

Gibt es gute "next-best" -Lösungen für dieses Problem?

6
Dies ist wahrscheinlich kein Thema bei Super-User und sollte stattdessen auf [unix.se] sein. Bitte überprüfen Sie meine Antwort, um eine bessere Methode als die gewählte zu finden. Evan Carroll vor 6 Jahren 0

5 Antworten auf die Frage

3
RedGrittyBrick

Gibt es ein Dienstprogramm wie Hexdump, das nicht-native Endian-Ness behandelt?

Ja, das Dienstprogramm heißt Perl.

Naja, eigentlich Data :: HexDumper - wenn Sie könnten Ihre eigene Rolle .

Zahlenformat Eine Zeichenfolge, die angibt, wie die Daten formatiert werden sollen. Es kann eine der folgenden sein, die Sie bemerken werden, haben die gleichen Bedeutungen wie die Pack-Funktion von Perl:  C - unsigniertes Zeichen S - vorzeichenlose 16-Bit-Endianness v oder S <- vorzeichenlose 16-Bit-Little-Endian n oder S> - vorzeichenlose 16-Bit-Big-Endian L - vorzeichenlose, native 32-Bit-Endianness V oder L <- vorzeichenlose 32-Bit-Little-Endian N oder L> - vorzeichenlose 32-Bit-Big-Endian Q - vorzeichenlose 64-Bit-Endianness Q <- unsigniertes 64-Bit-Little-Endian Q> - 64-Bit, Big Endian 
Ich bin nicht wirklich glücklich damit, mich auf Perl zu verlassen und die (allerdings sehr begrenzte) zusätzliche Typisierung im Vergleich zu Hexdump durchführen zu müssen, aber ich bin überzeugt, dass bessere Optionen nicht existieren. EHN vor 12 Jahren 0
3
Markarian451

Zumindest für 16-Bit-Wörter kann man es dd conv=swabwie in

cat file.dat | dd conv=swab | od -t x2 
1
Jonathan Ben-Avraham

Wie pixelbeat empfiehlt, könnten Sie objcopy verwenden :

$ objcopy -I binary -O binary --reverse-bytes=num inputfile.bin outputfile.bin 

Dabei numist 2 für 16-Bit-Wörter, 4 für 32-Bit-Wörter und 8 für 64-Bit-Wörter.

Leider hat objcopy keine Möglichkeit, Eingaben von zu akzeptieren stdinoder zu schreiben stdout, sodass Sie als Pipe ein Wrapper-Skript schreiben müssen, das temporäre Dateien erstellt.

Diese Antwort wird von https://stackoverflow.com/a/19288235/1979048 und von https://serverfault.com/a/329207/157443 kopiert .

1
Evan Carroll

Verwenden Sie einfach od(8.23 oder höher). Es ist Teil der Linux Standard Base und meiner Meinung nach besser als hexdumpbei allem. Es bietet eine endianOption,

‘--endian=order’ Reorder input bytes, to handle inputs with differing byte orders, or to provide consistent output independent of the endian convention of the current system. Swapping is performed according to the specified --type size and endian order, which can be ‘little’ or ‘big’. 

Sie können es so verwenden,

od --endian big -x 

Der Patch, um dies hinzuzufügen, wurde im Jahr 2014 festgelegt

od hat auf keinem der von mir verwendeten Systeme die Option --endian (GNU coreutils 8.22 oder OS X 10.11.6). EHN vor 6 Jahren 1
@EHN Es wurde im Jahr 2014 in 8.23 ​​festgeschrieben. Die Frage wurde aktualisiert. Evan Carroll vor 6 Jahren 1
0
fred

dd conv = swab <file.dat | Hexdump

Willkommen auf der Website. Könnten Sie diese Antwort ausführlich erläutern und erläutern, was dieser Befehl bewirkt, und ein bisschen mehr Detail? Darren vor 6 Jahren 3