假设我有一个字符串5a
。
这是ASCII字母Z
的十六进制表示。
我需要找到一个Linux shell命令,它可以接收一个十六进制字符串并输出该字符串所代表的ASCII字符。
因此,如果我执行以下命令:
echo 5a | command_im_looking_for
我将会看到一个单独的字母Z
:
Z
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
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
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 595a | awk -niord '$0=chr("0x"RT)' RS=.. ORS= | od -tx1c
0000000 59 5a
Y Z
$ 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=
类似于我在这里的回答:Linux shell scripting: hex number to binary string
你可以使用同样的工具来实现它(使用可打印 ASCII 字符而非 5a
):
echo -n 616263 | cryptocli dd -decoders hex
将会产生以下结果:
abcd