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

时间:2009-05-20 21:07:56

标签: bash ascii printf

价值的作用:

$ printf "%d\n" \'A
65
$ 

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

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

12 个答案:

答案 0 :(得分:55)

一行

printf "\x$(printf %x 65)"

两行

set $(printf %x 65)
printf "\x$1"

如果您不介意使用awk

,请参阅以下内容
awk 'BEGIN{printf "%c", 65}'

答案 1 :(得分:22)

这可行(使用八进制值):

$ printf '%b' '\101'
A

甚至(某些:不要超过7)序列:

$ printf '%b' '\'{101..107}
ABCDEFG

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

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

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

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

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

$ echo "41" | xxd -p -r
A

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

$ printf "%x" "'A" | xxd -p -r
A

同时也可以使用几个十六进制值:

$ echo "41 42 43 44 45 46 47 48 49 4a" | xxd -p -r
ABCDEFGHIJ

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

$ printf '%x' {65..90} | xxd -r -p 
ABCDEFGHIJKLMNOPQRSTUVWXYZ

甚至使用awk:

$ echo 65 | awk '{printf("%c",$1)}'
A

即使是序列:

$ seq 65 90 | awk '{printf("%c",$1)}'
ABCDEFGHIJKLMNOPQRSTUVWXYZ

答案 2 :(得分:9)

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

perl -e 'printf "%c\n", 65;'

答案 3 :(得分:8)

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

printf "\x41\n"
printf "\101\n"

答案 4 :(得分:8)

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

  

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

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

答案 5 :(得分:7)

如果要保存字符的ASCII值: (我在BASH做过这个并且有效)

{
char="A"

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

echo $testing}

输出: 65

答案 6 :(得分:4)

如果您将65转换为十六进制,那么0x41

$ echo -e "\x41" A

答案 7 :(得分:3)

这是将65转换为A(通过八进制)的另一种方法:

help printf  # in Bash
man bash | less -Ip '^[[:blank:]]*printf'

printf "%d\n" '"A'
printf "%d\n" "'A"

printf '%b\n' "$(printf '\%03o' 65)"

man bash中搜索\'使用(虽然在这种情况下徒劳无功):

man bash | less -Ip "\\\'"  # press <n> to go through the matches

答案 8 :(得分:1)

这会打印基本bash设置中的所有“可打印”字符:

printf '%b\n' $(printf '\\%03o' {30..127})

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

答案 9 :(得分:0)

大写字母:

i=67
letters=({A..Z})
echo "${letters[$i-65]}"

输出:

C

答案 10 :(得分:0)

这里是没有 eval $()或``:

ord () {
 local s
 printf -v s '\\%03o' $1
 printf "$s"
}

ord 65

答案 11 :(得分:0)

以下脚本打印 aaa...zzz(即 aaa > aab > aac > ... > zzx > zzy > zzz

for i in $(seq 0 25); do FIRST=$(printf \\$(printf '%03o' $[97+$i]) | tr -d '\n'); for f in $(seq 0 25); do SECOND=$(printf \\$(printf '%03o' $[97+$f]) | tr -d '\n'); for g in $(seq 0 25); do THIRD=$(printf \\$(printf '%03o' $[97+$g]) | tr -d '\n'); echo "${FIRST}${SECOND}${THIRD}"; done; done; done