Umwandlung von Hex-Strings in Ascii in der Bash-Befehlszeile

Ich habe eine Menge von dieser Art von Zeichenfolge und ich möchte einen Befehl, um es in ascii konvertieren zu finden, habe ich mit echo -e und od versucht, aber es hat nicht funktioniert.

0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2

Das hat bei mir funktioniert.

$ echo 54657374696e672031203220330 | xxd -r -p
Testing 1 2 3$

r" weist das Programm an, hex in ascii zu konvertieren, im Gegensatz zu seinem normalen Modus, der das Gegenteil tut

p" weist es an, ein einfaches Format zu verwenden.

Kommentare (1)
Lösung

Dieser Code wandelt den Text 0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2 in einen Strom von 11 Bytes mit entsprechenden Werten um. Diese Bytes werden auf den Standardausgang geschrieben.

TESTDATA=$(echo '0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2' | tr '.' ' ')
for c in $TESTDATA; do
    echo $c | xxd -r
done

Wie bereits von anderen erwähnt, führt dies nicht zu einer druckbaren ASCII-Zeichenkette, und zwar aus dem einfachen Grund, dass die angegebenen Bytes nicht ASCII sind. Sie müssen uns mehr Informationen darüber geben, wie Sie diese Zeichenfolge erhalten haben, damit wir Ihnen helfen können.

Wie es funktioniert: xxd -r übersetzt hexadezimale Daten in binäre (wie ein umgekehrter Hexdump). xxd verlangt, dass jede Zeile mit der Indexnummer des ersten Zeichens in der Zeile beginnt (führen Sie hexdump auf etwas aus und sehen Sie, wie jede Zeile mit einer Indexnummer beginnt). In unserem Fall soll diese Nummer immer Null sein, da jede Ausführung nur eine Zeile hat. Wie es der Zufall will, haben unsere Daten bereits Nullen vor jedem Zeichen als Teil der 0x-Notation. Das klein geschriebene x wird von xxd ignoriert, also müssen wir nur jedes 0xhh-Zeichen an xxd weiterleiten und es die Arbeit machen lassen.

Das tr wandelt Punkte in Leerzeichen um, so dass for sie korrekt aufteilt.

Kommentare (5)

Das echo -e muss bei Ihnen wegen falscher Escape-Schreibweise fehlgeschlagen sein. Der folgende Code funktioniert bei mir bei einer ähnlichen Ausgabe von Ihr_Programm mit Argumenten einwandfrei:

echo -e $(your_program with arguments | sed -e 's/0x\(..\)\.\?/\\x\1/g')

Bitte beachten Sie jedoch, dass Ihr ursprünglicher Hexstring aus nicht druckbaren Zeichen besteht.

Kommentare (0)