如何 "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 ' '
.
我需要使用 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 ' '
.