一部のASCII番号が与えられた文字を出力するには、printfを使用します。

一部のASCII番号が与えられた文字を出力するには、printfを使用します。

私は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進値と見なされます(ヌル引数は計算されますが印刷されません)。

おすすめ記事