Wie erstelle ich einen Hex-Dump einer Datei, die nur die Hex-Zeichen ohne Leerzeichen in Bash enthält?


188

Wie erstelle ich mit Bash einen unveränderten Hex-Dump einer Binärdatei unter Linux? Die Befehle odund hexdumpfügen beide Leerzeichen in den Speicherauszug ein, und dies ist nicht ideal.

Gibt es eine Möglichkeit, einfach eine lange Zeichenfolge mit allen Hex-Zeichen, Minuszeichen oder Zeilenumbrüchen in der Ausgabe zu schreiben?


Antworten:


250

xxd -p file

Oder wenn Sie alles in einer einzigen Zeile haben möchten:

xxd -p file | tr -d '\n'


13
fyi Um den Prozess umzukehren: xxd -r -ps hexascii.txt-Datei (es ist in Ordnung mit oder ohne Zeilenumbrüche)
Curtis Yallop

92

Formatzeichenfolgen können dazu führen, dass sich Hexdump genau so verhält, wie Sie es möchten (überhaupt kein Leerzeichen, Byte für Byte):

hexdump -ve '1/1 "%.2x"'

1/1bedeutet "jedes Format wird einmal angewendet und benötigt ein Byte" und "%.2x"ist die eigentliche Formatzeichenfolge, wie in printf. In diesem Fall: 2-stellige Hexadezimalzahl, führende Nullen, wenn kürzer.


7
Sie benötigen ein -voder es werden wiederholte Bytes gelöscht und durch ein Sternchen ersetzt.
Bis auf weiteres angehalten.

2
Ich frage mich , ob hexdump selbst in der Lage , die Newline (nur) bis zum Ende des Ausgangs .. (offensichtliche Anhängsel anhängen ; echomacht es unmöglich , als Bash alias zu verwenden)
mykhal

2
Mein Alias:alias to_hex="hexdump -ve '1/1 \"%.2x\"' && echo"
Devstuff

Die Iterationszahl und die Byteanzahl sind standardmäßig eins, so dass 1/1 weggelassen werden kann, so dass diehexdump -ve '"%.2x"'
Alex Che

@mykhal, es ist möglich, wenn Sie die Anzahl der ausgegebenen Bytes kennen. Sagen Sie, wenn Sie Hexdump verwenden, um nur 13 erste Bytes auszugeben:hexdump -n 13 -e '13/1 "%.2x" "\n"'
Alex Che

24

Es scheint von den Details der Version von abzuhängen od. Verwenden Sie unter OSX Folgendes:

od -t x1 -An file |tr -d '\n '

(Das wird als hexadezimale Bytes ohne Adresse gedruckt. Danach werden natürlich Leerzeichen gelöscht.)


1
Ich würde auch -vin diesem Zusammenhang hinzufügen , sonst überspringt es Wiederholungen mit *.
Ciro Santilli 法轮功 冠状 病 六四 事件 8

10

Perl Einzeiler:

perl -e 'local $/; print unpack "H*", <>' file

Verifiziert. Entspricht "xxd -p Datei | tr -d '\ n'".
Curtis Yallop

1
fyi Um den Prozess umzukehren: perl -e 'local $ /; Druckpaket "H *", <> '<hexascii.txt> -Datei
Curtis Yallop

Das "lokale $ /" ist nicht erforderlich.
Curtis Yallop

Update auf letzten Kommentar: Das "lokale $ /" ist für "pack" nicht erforderlich. Zum Entpacken benötigen Sie es, können aber alternativ "undef $ /" setzen. $ / ist das Zeilentrennzeichen (Standard-NL). undefined versetzt es in den Slurp-Modus. In einem Zeichenfolgenkontext referenziert <> wird also die gesamte Binärdatei abgerufen, ohne sie in Zeilen zu analysieren.
Curtis Yallop

Alternative Form: perl -e 'print entpacke "H *", join ("", <>)' <file
Curtis Yallop

2

Die anderen Antworten sind vorzuziehen, aber für eine reine Bash-Lösung habe ich das Skript in meiner Antwort hier geändert , um einen kontinuierlichen Strom von Hex-Zeichen ausgeben zu können, die den Inhalt einer Datei darstellen. (Der normale Modus ist das Emulieren hexdump -C.)

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.