使用printf将BASH中的字符整数ASCII值

73 bash printf ascii

品质价值作品:

$ printf "%d\n" \'A
65
$ 
Run Code Online (Sandbox Code Playgroud)

我有两个问题,第一个是最重要的:

  • 我怎么拿65并把它变成A?
  • \'使用printf将ASCII字符转换为其值.语法是特定printf还是在BASH的其他地方使用?(Google这样的小字符串很难用.)

小智 58

一条线

printf "\x$(printf %x 65)"
Run Code Online (Sandbox Code Playgroud)

两行

set $(printf %x 65)
printf "\x$1"
Run Code Online (Sandbox Code Playgroud)

如果你不介意使用,这是一个 awk

awk 'BEGIN{printf "%c", 65}'
Run Code Online (Sandbox Code Playgroud)

  • 也应该工作`printf"$(printf'\\ x%02x'$ char)"` (3认同)

小智 24

这有效(使用八进制值):

$ printf '%b' '\101'
A
Run Code Online (Sandbox Code Playgroud)

即使(某些:不要超过7)序列:

$ printf '%b' '\'{101..107}
ABCDEFG
Run Code Online (Sandbox Code Playgroud)

允许(十进制)任何范围内的值的一般构造是:

$ printf '%b' $(printf '\\%03o' {65..122})
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz
Run Code Online (Sandbox Code Playgroud)

或者您可以使用字符的十六进制值:

$ printf '%b' $(printf '\\x%x' {65..122})
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz
Run Code Online (Sandbox Code Playgroud)

您还可以使用xxd返回字符(使用十六进制值):

$ echo "41" | xxd -p -r
A
Run Code Online (Sandbox Code Playgroud)

也就是说,一个动作与另一个动作相反:

$ printf "%x" "'A" | xxd -p -r
A
Run Code Online (Sandbox Code Playgroud)

并且还可以同时使用几个十六进制值:

$ echo "41 42 43 44 45 46 47 48 49 4a" | xxd -p -r
ABCDEFGHIJ
Run Code Online (Sandbox Code Playgroud)

或序列(此处使用printf获取十六进制值):

$ printf '%x' {65..90} | xxd -r -p 
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Run Code Online (Sandbox Code Playgroud)

甚至使用awk:

$ echo 65 | awk '{printf("%c",$1)}'
A
Run Code Online (Sandbox Code Playgroud)

即使是序列:

$ seq 65 90 | awk '{printf("%c",$1)}'
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Run Code Online (Sandbox Code Playgroud)


mou*_*iel 9

对于这种转换,我使用perl:

perl -e 'printf "%c\n", 65;'
Run Code Online (Sandbox Code Playgroud)

  • 或在perl中,print chr(65),"\n"; 虽然perl可能是一个很好的选择,如果你做了很多这个,使用shell的printf将你的数字转换为可以进入\ 0转义序列的东西工作得很好.使用unicode更复杂,因为您需要在printf中支持. (2认同)

Naa*_*aff 8

一种选择是使用十六进制或八进制表示法直接输入您感兴趣的字符:

printf "\x41\n"
printf "\101\n"
Run Code Online (Sandbox Code Playgroud)


Dav*_* Hu 8

对于你的第二个问题,似乎领先引用语法(\'A)特定于printf:

如果前导字符是单引号或双引号,则该值应为单引号或双引号后字符的基础代码集中的数值.

来自http://pubs.opengroup.org/onlinepubs/009695399/utilities/printf.html


小智 7

如果你想保存字符的ASCII值:(我在BASH中做了这个并且它工作了)

{
char="A"

testing=$( printf "%d" "'${char}" )

echo $testing}
Run Code Online (Sandbox Code Playgroud)

输出:65


Cyb*_*ira 6

如果转换65为十六进制则为0x41

$ echo -e "\x41" A


Cyr*_*rus 6

对于大写字母:

i=67
letters=({A..Z})
echo "${letters[$i-65]}"
Run Code Online (Sandbox Code Playgroud)

输出:

C