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

答え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

関連情報