如何 "decdump" bash 中的字符串?

how to "decdump" a string in bash?

我需要使用 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 十六进制代码给出结果?

Unicode 解决方案

让这个问题恼人的是,当从十六进制转换为十进制时,您必须对字符进行管道传输。因此,您不能进行从 char 到 hex 到 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 的回答

如果您不介意结果合并成一行,请尝试以下操作:

echo -n "abc" | xxd -p -c 1 |
while read -r line; do
    echo -n "$(( 16#$line ))"
done

结果:

979899
str=abc
printf '%s' $str | od -An -tu1

-An 去掉了 od 通常输出的地址行,-tu1 将每个输入字节视为无符号整数。请注意,它假定一个字符是一个字节,因此它不适用于 Unicode、JIS 等。

如果您真的不希望结果中有空格,请将其进一步输送到 tr -d ' '.