hexdump vs xxd Formatunterschied


9

Ich suchte nach einem Reverse Hexdump und fand xxd erwähnt. Es scheint jedoch nicht einfach zu funktionieren:

xxd -r hexdumpfile > binaryfile

Ich habe dann den Unterschied zwischen den Ausgaben von xxd infileund verglichen hexdump infileund drei Unterschiede festgestellt:

  1. xxd Ausgabe hat einen Doppelpunkt nach der Adresse
  2. Bei der xxd-Ausgabe sind die Positionen in den Daten umgekehrt (z. B. wird 5a42bei der Hexdump-Ausgabe die 425axxd-Ausgabe).
  3. Nach jeder Zeile stehen einige zusätzliche Zeichen

Ich habe nur die hexadezimale Version bestimmter Dateien auf einem Server. Wie kann ich die Binärdaten mit xxd korrekt zurückerhalten?


Ich suchte nach einer Option in xxd, um das Hexdump-Format zu verwenden, schaffte es aber
vorerst

Ich habe nicht genau getestet, was Sie fragen, aber versuchen Sie xxd -p und -b, -p ist einfach -b ist binär, sowie Ihr -r. Die Bytereihenfolge hat mit Big Endian und Little Endian zu tun, und vielleicht kann xxd das nicht umkehren. Aber es hängt damit zusammen, wie die Bytes in der Datei gespeichert werden. Ähnlich, wenn Sie eine Textdatei im Editor haben Sie können es als Unicode-16-Bit-Big-Endian oder Little-Endian oder UTF-8 oder was auch immer speichern, und Sie sehen den Unterschied zu xxd. Der Befehl od zeigt ihn möglicherweise anders an.
Barlop

Zum späteren Nachschlagen hexdumpkönnen Sie die Endianness auswählen, die in der Ausgabe verwendet wird, was dies vereinfachen könnte. (Warum jetzt? Fand Ihre Frage hilfreich für etwas, das nichts damit zu
tun hat

Antworten:


7

Es gibt keinen Befehl, von dem ich weiß, dass er die Konvertierung durchführt, aber er kann leicht in ein paar Schritte unterteilt werden:

  1. Entfernen Sie Adressen von der hexdumpAusgabe mitsed
  2. Konvertieren in binär mit xxd
  3. Endian - Umwandlung (beispielsweise 5a42wird 425a) unter Verwendung vondd

Hier ist der vollständige Befehl:

sed 's/^[0-9]*//' hexdump | xxd -r -p | dd conv=swab of=binaryfile

funktioniert nicht, wenn der Hexdump mit 0a endet
Smeterlink

1

Diese Antwort ist ein Cross-Post von https://stackoverflow.com/a/52834021/6770384

Sie können die Konvertierung in einem sedBefehl durchführen. Es reicht aus, :die Adresse nach der Adresse hinzuzufügen und die Endianness zu ändern (Umschalten ab12auf 12ab).

sed -E 's/ /: /;s/ (..)(..)/ \2\1/g;$d' dump | xxd -r

Bekannte Fehler (siehe Kommentarbereich)

  • Ein nachfolgendes Nullbyte wird hinzugefügt, wenn die Originaldatei eine ungerade Länge hatte (z. B. 1, 3, 5, 7, ..., Byte lang).
  • Wiederholte Abschnitte der Originaldatei werden nicht korrekt wiederhergestellt, wenn sie hexdumpmit a  bearbeitet wurden *.

funktioniert nicht, wenn der Hexdump mit 0a endet
Smeterlink

@ Metermeter Danke für diese Beobachtung! Sie haben Recht: Dieser Befehl erzeugt ein nachfolgendes Nullbyte, das nicht in der Originaldatei enthalten war, wenn die Länge in Bytes eine ungerade Zahl war. Ich habe auch einen anderen Fehler gefunden. hexdumpkann wiederholte Teile mit a verbergen *. Dieser Befehl kann diese Teile auch nicht korrekt wiederherstellen. Beispiel: yes | head -n100 | hexdump | sed -E 's/ /: /;s/ (..)(..)/ \2\1/g' | xxd -rGibt nur 8 ystatt 100 aus. Um diese Probleme zu beheben, ist mehr als dieser Einzeiler erforderlich. Vielleicht füge ich in Zukunft ein weiteres Skript hinzu.
Socowi

danke für den *tipp, wusste es nicht!
Smeterlink
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.