ASCIIテーブルには、さまざまな数値スキームのコードポイントを持つ「J」文字があります。
Oct Dec Hex Char
112 74 4A J
printf '\112'
この文字は、またはを印刷して8進数のコードポイントに印刷できますecho $'\112'
。 10進数と16進数のコードポイント表現を使用して、同じ文字をどのように印刷できますか?
答え1
16進数:
printf '\x4a'
12月:
printf "\\$(printf %o 74)"
16進代替 :-)
xxd -r <<<'0 4a'
答え2
通常、シェルは、次のように定義されている限り、変数の16進数、8進数、および10進数を理解しますintegers
。
$ declare -i v1 v2 v3 v4 v5 v6 v7
$ v1=0112
$ v2=74
$ v3=0x4a
$ v4=8#112
$ v5=10#74
$ v6=16#4a
$ v7=18#gg
echo "$v1 $v2 $v3 $v4 $v5 $v6 $v7"
74 74 74 74 74 74 304
または「算術拡張」の結果です。
$ : $(( v1=0112, v2=74, v3=0x4a, v4=8#112, v5=10#74, v6=16#4a, v7=18#gg ))
$ echo "$v1 $v2 $v3 $v4 $v5 $v6 $v7"
74 74 74 74 74 74 304
したがって、変数値の一部である文字を印刷する方法が必要です。
しかし、これには2つの可能なアプローチがあります。
$ var=$((0x65))
$ printf '%b\n' "\\$(printf '0%o' "$var")"
e
$ declare -i var
$ var=0x65; printf '%b\n' "\U$(printf '%08x' "$var")"
e
2つのprintfが必要です。 1つは値を16進文字列に変換し、もう1つは実際に文字を印刷します。
2番目はUnicodeポイントを印刷します(コンソールが正しく設定されている場合)。
たとえば、
$ var=0x2603; printf '%b\n' "\U$(printf '%08x' "$var")"
☃
雪だるま。
utf-8表現を使用する文字f0 9f 90 ae
は次のとおりです0x1F42E
。cow face site:fileformat.info
発見それを得る:
$ var=0x1F42F; printf '%b\n' "\U$(printf '%08x' "$var")"
答え3
素数:
chr() {
local c
for c
do
printf "\\$((c/64*100+c%64/8*10+c%8))"
done
}
chr 74
16進数:
chr $((16#4a))
この関数は次のシーケンスを実行できます。
$ chr 74 75 76; echo
JKL
$
答え4
変換する数値のリストがあり、関数呼び出しを避け、各文字のサブシェルを作成したい場合は、ASCIIセットを事前定義できます。
ascii=$(for x in {0..9} {A..F}; do for y in {0..9} {A..F}; do echo -ne "\x$x$y"; done; done)
null 文字は除外されるため、各文字は 1 ずつオフセットされます。
次に、次のように使用します(1行に1つの数字を仮定)。
while read c; do out+="${ascii:$c-1:1}"; done <<< "$in"
echo "$out"