我需要使用bash命令将字符串转换为十进制ascii代码序列。
示例:对于字符串“abc”,需要的输出是979899
其中a=97、b=98和c=99在ascii十进制代码中。
我能够通过使用xxd的ascii十六进制代码来实现这一点。
printf '%s' 'abc' | xxd -p
这给了我一个结果:616263
其中a=61、b=62和c=63在ascii十六进制代码中。
是否存在与xxd等价的结果,以ascii十进制代码代替ascii十六进制代码?
发布于 2019-11-14 18:02:41
如果您不介意将结果合并到一行中,请尝试以下操作:
echo -n "abc" | xxd -p -c 1 |
while read -r line; do
echo -n "$(( 16#$line ))"
done
结果:
979899
发布于 2019-11-14 17:32:48
Unicode解决方案
使这个问题恼人的是,当您将十六进制转换为十进制时,必须对字符进行管道处理。因此,您不能简单地从char转换为十六进制到dec,因为一些字符十六进制表示比其他字符更长。
这两种解决方案都与unicode兼容,并使用字符的代码点。在这两种解决方案中,为了清晰起见,选择换行符作为分隔符;如果没有分隔符,则将其更改为''
。
Bash
sep='\n'
charAry=($(printf 'abc' | grep -o .))
for i in "${charAry[@]}"; do
printf "%d$sep" "'$i"
done && echo
97
98
99
127926
Python (以Bash表示)
在这里,我们使用一个列表理解来将每个字符转换为一个十进制数(ord),以字符串的形式加入它并打印它。sys.stdin.read()
允许我们使用Python从管道中获取输入。如果用预期的字符串替换input
,则此解决方案将跨平台。
printf '%s' 'abc' | python -c "
import sys
input = sys.stdin.read()
sep = '\n'
print(sep.join([str(ord(i)) for i in input]))"
97
98
99
127926
编辑:如果您只关心使用十六进制而不管编码,请使用@user1934428的答案。
发布于 2019-11-14 22:21:55
str=abc
printf '%s' $str | od -An -tu1
-An去掉通常输出的地址行,-tu1将每个输入字节视为无符号整数。请注意,它假定一个字符是一个字节,因此它不能使用Unicode、JIS等。
如果您真的不需要结果中的空格,那么将其进一步导入到tr -d ' '
中。
https://stackoverflow.com/questions/58868334
复制相似问题