如何在Linux shell中将十六进制转换为ASCII字符?

75

假设我有一个字符串5a

这是ASCII字母Z的十六进制表示。

我需要找到一个Linux shell命令,它可以接收一个十六进制字符串并输出该字符串所代表的ASCII字符。

因此,如果我执行以下命令:

echo 5a | command_im_looking_for

我将会看到一个单独的字母Z

Z
14个回答

1
根据@Randal comment的说法,您可以使用perl,例如。
$ printf 5a5a5a5a | perl -lne 'print pack "H*", $_'
ZZZZ

另一方面:
$ printf ZZZZ | perl -lne 'print unpack "H*", $_'
5a5a5a5a

另一个包含文件的示例:
$ printf 5a5a5a5a | perl -lne 'print pack "H*", $_' > file.bin
$ perl -lne 'print unpack "H*", $_' < file.bin
5a5a5a5a

1
你可以使用这个命令(Python脚本)来处理更大的输入:
echo 58595a | python -c "import sys; import binascii; print(binascii.unhexlify(sys.stdin.read().strip()).decode())"

结果将是:

结果将是:

XYZ

而为了更简便,定义一个别名:

alias hexdecoder='python -c "import sys; import binascii; print(binascii.unhexlify(sys.stdin.read().strip()).decode())"'

echo 58595a | hexdecoder

0

GNU awk 4.1

awk -niord '$0=chr("0x"RT)' RS=.. ORS=

请注意,如果您将其回显,它会产生一个额外的空字节。
$ echo 595a | awk -niord '$0=chr("0x"RT)' RS=.. ORS= | od -tx1c
0000000  59  5a  00
          Y   Z  \0

请使用printf代替。
$ printf 595a | awk -niord '$0=chr("0x"RT)' RS=.. ORS= | od -tx1c
0000000  59  5a
          Y   Z

请注意,GNU awk 默认生成 UTF-8 编码。
$ printf a1 | awk -niord '$0=chr("0x"RT)' RS=.. ORS= | od -tx1
0000000 c2 a1

如果你正在处理ASCII之外的字符,并且你将对结果字符串进行Base64编码,你可以使用-b禁用UTF-8。

echo 5a | sha256sum | awk -bniord 'RT~/\w/,$0=chr("0x"RT)' RS=.. ORS=

0

类似于我在这里的回答:Linux shell scripting: hex number to binary string

你可以使用同样的工具来实现它(使用可打印 ASCII 字符而非 5a):

echo -n 616263 | cryptocli dd -decoders hex

将会产生以下结果:

abcd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接