私はASCII番号(16進数)を使用していくつかの文字を出力しようとしましたprintf
。次のようになります。
#!/bin/bash
hexchars () { printf '\x%s' $@ ;}
hexchars 48 65 6c 6c 6f
Expected output:
Hello
何らかの理由でこれは機能しません。どんなアイデアがありますか?
編集する:
Isaacが提供した回答(許可された回答)に基づいて、次の機能を使用しました。
chr () { local var ; printf -v var '\\x%x' $@ ; printf "$var" ;}
サブシェルを避けて速度を向上させるために、彼の答えを少し書き直しました。
Result:
~# chr 0x48 0x65 0x6c 0x6c 0x6f
Hello
~# chr 72 101 108 108 111
Hello
~# chr {32..126}
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}
この関数の逆関数は、次のようなchr
関数になると思います。
asc () { printf '%d\n' "'$1" ;}
asc A
65
chr 65
A
それとも厳格な16進変形が必要な場合...
chrx () { local var ; printf -v var '\\x%s' $@ ; printf "$var\n" ;}
ascx () { printf '%x\n' "'$1" ;}
chrx 48 65 6c 6c 6f
Hello
ascx A
41
ありがとうございます!
答え1
ああ、もちろんです。 2つのステップを踏むだけです。これは2段階のタンゴと同じです。
$ printf "$(printf '\\x%s' 48 65 6c 6c 6f)"; echo
Hello
または他のオプション:
$ test () { printf "$(printf '\\x%s' "$@")"; echo; }
$ test 48 65 6c 6c 6f
Hello
または、「引数なし」の印刷を防ぐには、次の手順を実行します。
$ test () { [ "$#" -gt 0 ] && printf "$(printf '\\x%s' "$@")"; echo; }
$ test 48 65 6c 6c 6f
Hello
$
引数は1から127までの10進値と見なされます(ヌル引数は計算されますが印刷されません)。
答え2
\x
一つに従ってください言葉16進値:
$ printf '\x48\n'
H
$ c=48
$ printf '\x%s\n' "$c"
bash: printf: missing hex digit for \x
\x48
printf
おそらく、これは結果の文字列を書式で使用する前に、書式文字列のすべての16進リテラルが別々のステップに拡張されるためです。
あなたは何ができますか?
unhexlify() {
for character
do
format="\x${character}"
printf "$format"
done
printf '\n'
}
テスト:
$ unhexlify 48 65 6c 6c 6f
Hello
答え3
使用真珠それがpack
することは、2つの16進数を囲み、ASCII表現を印刷することです。
charx() {
perl -le 'print pack "(H2)*", @ARGV' -- "$@"
}
私たちはデスクトップ電卓を使います直流16進数を入力し、次のコマンドを使用してASCII文字で印刷します。ㅏ注文する。
charx() {
dc <<eof
16i
$(echo "$@" | tr a-f A-F)
[SAz0<a]sa
[LAanln1-dsn0<b]sb
[zsnlaxlbxAan]sc
z0<c
eof
}
次のように使用されます。
charx 48 65 6c 6c 6f
結果
Hello