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?

David Raswik
quelle

Antworten:

250

xxd -p file

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

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

mark4o
quelle
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.

Michał Trybus
quelle
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.)

Donal Fellows
quelle
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
Alan Haggai Alavi
quelle
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.)

Bis auf weiteres angehalten.
quelle