在 bash 中进行 Ascii/Hex 转换

66

我现在正在这样做:

[root@~]# echo Aa|hexdump -v
0000000 6141 000a                              
0000003
[root@~]# echo -e "\x41\x41\x41\x41"
AAAA

但它的行为并不完全符合我的预期,

Aa 的十六进制形式应该是 4161,但输出结果是 6141 000a,这似乎没有意义。

在执行十六进制到 ASCII 转换时,是否有其他实用程序可以使我不需要前缀 \x


相关链接:https://dev59.com/nnE85IYBdhLWcg3wx2n2#2614831 - Ciro Santilli OurBigBook.com
相关链接:https://stackoverflow.com/questions/2614764/how-to-create-a-hex-dump-of-file-containing-only-the-hex-characters-without-spac/2614831#2614831 - undefined
15个回答

1

SteinAir上面的回答对我很有帮助--谢谢!以下是一种它启发的方法,将十六进制字符串转换为ASCII:

for h in $(echo "4161" | sed "s/\(..\)/\1 /g"); do printf `echo "\x$h"`;done
Aa

1
echo -n Aa | hexdump -e '/1 "%02x"'; echo

0
jcomeau@aspire:~$ echo -n The quick brown fox jumps over the lazy dog | python -c "print raw_input().encode('hex'),"
54686520717569636b2062726f776e20666f78206a756d7073206f76657220746865206c617a7920646f67
jcomeau@aspire:~$ echo -n The quick brown fox jumps over the lazy dog | python -c "print raw_input().encode('hex')," | python -c "print raw_input().decode('hex'),"
The quick brown fox jumps over the lazy dog

这也可以用Python3完成,但方式不同,而我是个懒狗。


1
python != bash - Yokai
1
不是 sedhexdumpprintfawk 或者 xxd - jcomeau_ictx
它比其他一些解决方案更短,而且可读性更好。它可以从Bash命令行双向转换。我不明白你的观点。 - jcomeau_ictx
2
重点是,他要求一个Bash解决方案。意思是,根据他的上下文,需要使用Bashism或Bash内建命令。你没有提供Python解决方案中的这些内容。 - Yokai

0
根据 http://mylinuxbook.com/hexdump/,您可以使用hexdump格式参数。
echo Aa | hexdump -C -e '/1 "%02X"'

将返回4161

要在末尾添加额外的换行符,请添加另一个格式化程序。

但是:以上所给格式会为重复字符提供多个输出。

$ printf "Hello" | hexdump -e '/1 "%02X"' 
48656C*
6F

而不是

48656c6c6f

-1

echo在末尾添加回车符。

使用

echo -e

去掉多余的0x0A

另外,默认情况下,hexdump 不会按字节工作。这就是为什么它显示字节的顺序很奇怪并且为什么它会显示一个额外的0x00。


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