Konvertieren Sie ASCII-Code im UNIX-Shell-Skript in Hexadezimal

8

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?

Olivier DUVAL
quelle
3
Siehe meine Antwort auf diese Frage, die Sie auf Stack Overflow veröffentlicht haben.
Bis auf weiteres angehalten.

Antworten:

14

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
Michael Mrozek
quelle
Vielen Dank, es funktioniert perfekt
Olivier DUVAL
Das einzige Problem dabei ist , mit 2-Byte - Zeichen , dessen Code beginnt mit 0. zB hex 'ץ'geben %5e5statt %05e5. Sie sollten den Hauptteil der Funktion in s=printf "%%% 04x" "'$ 1"; echo "%${s%00}"
pyrocrasty
4

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.

Cristian Ciupitu
quelle
2
Nett. Sie können verwenden echo -n, um die Newline am Ende wegzulassen, damit Sie odsie nicht aufheben und in0a
Michael Mrozek
2

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
Peter.O
quelle
Fügen Sie beim Zurücksetzen möglicherweise den Schalter -p hinzu : xxd -r -p. Hat xxd -rim obigen Beispiel einfach nicht funktioniert.
Bytefire