Ich möchte ASCII-Code (wie -oder _oder .usw.) in eine hexadezimale Darstellung in der Unix-Shell (ohne bcBefehl) konvertieren , z . B.: -=> %2d.
Irgendwelche Ideen?
Ich möchte ASCII-Code (wie -oder _oder .usw.) in eine hexadezimale Darstellung in der Unix-Shell (ohne bcBefehl) konvertieren , z . B.: -=> %2d.
Irgendwelche Ideen?
Antworten:
Es gibt ein printfTool, das die C-Funktion simuliert. Normalerweise ist es so /usr/bin/printf, aber viele Shells implementieren auch integrierte Funktionen. Sie können verwenden %02x, um die Hex-Darstellung eines Zeichens zu erhalten, aber Sie müssen sicherstellen, dass Sie eine Zeichenfolge übergeben, die das Zeichen in einfache Anführungszeichen enthält ( Bearbeiten : Es stellt sich heraus, dass nur ein einfaches Anführungszeichen am Anfang ausreicht):
printf "%%%02x\n" "'-" # Outputs %2d
Sie können der Einfachheit halber eine Shell-Funktion erstellen:
function hex() {
printf "%%%02x\n" "'$1"
}
hex - # Outputs %2d
hex _ # Outputs %5f
hex . # Outputs %2e
hex 'ץ'geben %5e5statt %05e5. Sie sollten den Hauptteil der Funktion in s=printf "%%% 04x" "'$ 1"; echo "%${s%00}"
Versuchen Sie od :
$ echo -n "-_." | od -A n -t x1
2d 5f 2e
-A nbedeutet, dass keine Offsets gedruckt werden und -t x1dass der Typ der Eingabe hexadezimale Ganzzahlen von 1 Byte sind.
echo -n, um die Newline am Ende wegzulassen, damit Sie odsie nicht aufheben und in0a
xxdist ein Hex-Dump-Dienstprogramm, das als Teil des vim-commonPakets geliefert wird.
Es verfügt über eine praktische -pOption, die einen fortlaufenden Hexdump-Stil "Plain / Postscript" ausgibt. Dies kann problemlos rückgängig gemacht werden, indem -r... -uHex-Ziffern in Großbuchstaben ausgegeben werden.
$ echo -n "M" |xxd -p # 1 ASCII char= 1 UTF-8 byte; Unicode Codepoint: U+0041
4d
$ echo -n "〶" |xxd -p -u # 1 CJK char= 3 UTF-8 bytes; Unicode Codepoint: U+3036
E380B6
$ echo -n "Dump a string" |xxd -p -u
44756D70206120737472696E67
$ echo -n "Dump and Revert" |xxd -p |xxd -r
Dump and Revert
xxd -r -p. Hat xxd -rim obigen Beispiel einfach nicht funktioniert.