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?


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

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.


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

Fügen Sie beim Zurücksetzen möglicherweise den Schalter -p hinzu : xxd -r -p. Hat xxd -rim obigen Beispiel einfach nicht funktioniert.
Bytefire
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.