Wie konvertieren von hex in ASCII-Zeichen in der Linux-shell?
Sagen wir, ich habe einen string 5a
.
Dies ist die hexadezimale Darstellung von ASCII-Buchstaben Z
.
Ich wissen muss, um ein Linux-shell-Befehl nehmen Sie einen hex-string und Ausgabe der ASCII-Zeichen, die die Zeichenkette repräsentiert.
So, wenn ich tun:
echo 5a | command_im_looking_for
Werde ich sehen, ein einsamer Brief Z
:
Z
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beachten Sie, dass diese nicht überspringen, nicht-hex-Zeichen. Wenn Sie wollen einfach nur die hex (kein whitespace-Zeichen aus dem ursprünglichen string, etc.):
Auch
zsh
undbash
unterstützen dies nativ inecho
:perl -lne 'print pack "H*", $_'
.perldoc -f pack
jedes mal 😉 natürlich YMMV...echo -ne '\x5a'
notwendig ist, zum Beispiel: ohne-n Schalter für echo, eine neue Zeile ('\x0a') ausgegeben wird, nach der Z.echo -ne '\x5a\xde\x0b\x0d' | xxd
echo -e "$(echo $hex | sed 's_\(..\)_\\x\1_g')"
. Sah gerade den nächsten post mitxxd
.echo $hex | xxd -r -p
arbeitete wie ein Charme.Ich verwendet, um dies tun, indem xxd
Aber dann habe ich gemerkt, Debian/Ubuntu, xxd ist Teil der vim-common und daher möglicherweise nicht in ein minimal-system. Vermeiden auch perl (imho auch nicht Teil einer minimal-system) landete ich mit sed, xargs und printf wie diese:
Meistens habe ich nur wollen, um zu konvertieren ein paar bytes und es ist okay für solche Aufgaben. Der Vorteil dieser Lösung gegenüber der von ghostdog74 ist, dass dies kann konvertieren hex-strings beliebiger Längen automatisch. xargs verwendet, da printf nicht Lesen von der Standardeingabe.
"echo -n 5a | xxd -r -p"
ich würde es vorziehen, zu verwenden"xxd -r -p <<< 5a"
. Vorteile: (1) ein paar weniger Zeichen eingeben (die Eingabe auch schneller, da der 3x Wiederholung); (2) läuft nur ein - Befehl (speichert dieecho
), nicht beiden => schneller Ausführung.here string
in der Bash (ein Konzept ähnlich einemhere document
).Können Sie durch echo-nur ohne die anderen Sachen. Vergessen Sie nicht, fügen Sie "-n", oder Sie bekommen einen Zeilenumbruch automatisch:
Bash-one-liner
echo -n "0102abcd" | while read -n 2 code; do printf "\x$code"; done | hexdump
Erträge0201 cdab
echo -n "0102abcd" | while read -n 2 code; do printf "\x$code"; done | hexdump -e '/1 "%02x"'
je nachdem, wo Sie bekam, dass "5a', können Sie fügen Sie einfach \x und übergeben printf
printf "\x${a}"
Einige Python ist3 one-Liner, die Arbeit mit einer beliebigen Anzahl von bytes.
Dekodierung von hex (mit
strip
, so dass es ist ok, um einen Zeilenumbruch auf der Standardeingabe (stdin):Codierung hex:
Hier ist ein reines bash-script (als printf ist ein bash-builtin) :
Ob bash bereits ausgeführt, sollte dies schneller als jede andere Lösung, die Einleitung eines neuen Prozesses.
for ((i=0; i<${#p}; i+=2));do p2+=\\x${p:$i:2};done
dc umwandeln kann zwischen numerischen Basen:
print
zusys.stdout.write
um zu verhindern, dass die zusätzlichen Zeilenvorschub-Zeichen.GNU awk 4.1
Beachten Sie, dass, wenn man das echo auf diese wird es produzieren eine zusätzliche null-byte
Stattdessen printf
Beachten Sie auch, dass GNU-awk erzeugt standardmäßig UTF-8
Wenn Sie sind den Umgang mit Zeichen außerhalb von ASCII, und Sie gehen zu
Base64-Codierung die resultierende Zeichenfolge, können Sie deaktivieren Sie UTF-8 mit
-b
Ähnlich wie meine Antwort hier: Linux shell-scripting: die hex-Zahl in einen Binär-string
Können Sie tun es mit dem gleichen tool wie dieses (mit ascii-druckbare Zeichen anstelle von
5a
):Erhalten Sie Folgendes Ergebnis:
Als pro @Randal Kommentar, die Sie verwenden können
perl
z.B.sein und Umgekehrt:
Ein anderes Beispiel-Datei: