wake-up-neo.com

Ascii/Hex-Konvertierung in Bash

Ich mache es jetzt so:

[[email protected]~]# echo Aa|hexdump -v
0000000 6141 000a                              
0000003
[[email protected]~]# echo -e "\x41\x41\x41\x41"
AAAA

Aber es ist nicht genau so, wie ich wollte,

die Hex-Form von Aa sollte 4161 sein, aber die Ausgabe ist 6141 000a, was keinen Sinn macht.

gibt es bei der Ausführung von hex to ascii ein anderes Hilfsprogramm, damit ich das Präfix \x nicht benötige?

35
gdb

Der Grund ist, dass hexdump standardmäßig 16-Bit-Ganzzahlen und keine Bytes ausgibt. Wenn dies in Ihrem System vorhanden ist, werden hd (oder hexdump -C) oder xxd weniger überraschende Ausgaben liefern. Andernfalls ist od -t x1 eine POSIX-Standardmethode, um eine Byte-für-Byte-Hex-Ausgabe zu erhalten. Sie können od -t x1c verwenden, um sowohl die Byte-Hex-Werte als auch die entsprechenden Buchstaben anzuzeigen.

Wenn Sie xxd haben (was im Lieferumfang von vim enthalten ist), können Sie xxd -r verwenden, um die Konvertierung von Hex (aus demselben Format, das xxd erzeugt) umzuwandeln. Wenn Sie nur ein einfaches Hex haben (nur die '4161', die von xxd -p erzeugt wird), können Sie xxd -r -p verwenden, um zurück zu konvertieren.

49
Random832

Versuchen Sie es für den ersten Teil

echo Aa | od -t x1

Es wird Byte für Byte gedruckt

$ echo Aa | od -t x1
0000000 41 61 0a
0000003

Der 0a ist die implizite Newline, die das Echo erzeugt.

Verwenden Sie stattdessen echo -n oder printf.

$ printf Aa | od -t x1
0000000 41 61
0000002
16
Mikel
$> printf "%x%x\n" "'A" "'a"
4161
13
bash-o-logist

Für einzeilige Lösung:

echo "Hello World" | xxd -ps -c 200 | tr -d '\n'

Es wird gedruckt:

48656c6c6f20576f726c640a

oder für Dateien:

cat /path/to/file | xxd -ps -c 200 | tr -d '\n'

Für Rückwärtsbetrieb:

echo '48656c6c6f20576f726c640a' | xxd -ps -r

Es wird gedruckt:

Hello World
7
Fırat KÜÇÜK

Mit bash:

a=abcdefghij    
for ((i=0;i<${#a};i++));do printf %02X \'${a:$i:1};done

6162636465666768696A

2
Vouze

Ich weiß nicht, wie verrückt es aussieht, aber es funktioniert wirklich gut

ascii2hex(){ a="[email protected]";s=0000000;printf "$a" | hexdump | grep "^$s"| sed s/' '//g| sed s/^$s//;}

Dies wurde erstellt, als ich versuchte, meinen Namen in HEX zu sehen;) Wie kann man es verwenden :)

2
Kundan Kumar
echo -n Aa | hexdump -e '/1 "%02x"'; echo
1
baz

Die Antwort von SteinAir war hilfreich für mich - Danke! Und unten ist ein Weg, wie er inspiriert wurde, um Hex-Strings in ASCII zu konvertieren: 

for h in $(echo "4161" | sed "s/\(..\)/\1 /g"); do printf `echo "\x$h"`;done
Aa
1
scoombs
Text2Conv="Aa"
for letter in $(echo "$Text2Conv" | sed "s/\(.\)/'\1 /g");do printf '%x' "$letter";done

4161

Der Trick besteht darin, sed zum Analysieren der Text2Conv-Datei zu verwenden, um sie zu formatieren.

1
SteinAir

hier ein kleines Skript, das ich geschrieben habe, um ASCII in Hex umzuwandeln. ich hoffe es hilft: 

echo '0x'"`echo 'ASCII INPUT GOES HERE' | hexdump -vC |  awk 'BEGIN {IFS="\t"} {$1=""; print }' | awk '{sub(/\|.*/,"")}1'  | tr -d '\n' | tr -d ' '`" | rev | cut -c 3- | rev
1
blogresponder

gemäß http://mylinuxbook.com/hexdump/ können Sie den hexdump-Formatparameter verwenden

echo Aa | hexdump -C -e '/1 "%02X"'

wird 4161 zurückgeben

um am Ende einen zusätzlichen Zeilenvorschub hinzuzufügen, hängen Sie einen anderen Formatierer an.

ABER: Das oben angegebene Format liefert Multiplikatorausgaben für sich wiederholende Zeichen

$ printf "Hello" | hexdump -e '/1 "%02X"' 
48656C*
6F

anstatt 

48656c6c6f
0
childno͡.de

Ich benutze:

> echo Aa | tr -d '\n' | xxd -p
4161

> echo 414161 | tr -d '\n' | xxd -r -p
AAa

Das tr -d '\n' schneidet mögliche Zeilenumbrüche in Ihrer Eingabe ab

0
stelios