如何在Bash中将字符串转换为十六进制

17

我在StackOverflow上找到了很多关于这个问题的帖子,涵盖了C++、C#和其他语言的解决方案,但没有关于Shell的。

使用Bash/Shell,如何将随机的String转换为byte array

我尝试过:

echo "some string" | xxd -r -p

但它没有生效。

我基本上想要一个字节输出 - 例如 )?e?GV??vY?Ge?#G


1
使用什么编码的字节数组? - trojanfoe
1
“some string”的字节输出是“some string”。 - Eugene
@alecrosic:你提供的示例输出与输入有何关联? - user1934428
2个回答

33

如果你想要获取一些字符串的十六进制值,可以使用以下方法:

$ echo "testing some values"$'\157' | xxd
0000000: 7465 7374 696e 6720 736f 6d65 2076 616c  testing some val
0000010: 7565 736f 0a                             ueso.

如果您只需要“纯文本”字符串:
$ echo "testing some values"$'\157' | xxd -p
74657374696e6720736f6d652076616c7565736f0a

如果你需要“反转”一个十六进制字符串,可以这样做:
$ echo "74657374696e6720736f6d652076616c7565736f0a" | xxd -r -p
testing some valueso

如果你需要的是字符表示(而非十六进制),你可以这样做:
$ echo "testing:"$'\001\011\n\bend test'  | od -vAn -tcx1
  t   e   s   t   i   n   g   : 001  \t  \n  \b   e   n   d    
 74  65  73  74  69  6e  67  3a  01  09  0a  08  65  6e  64  20
  t   e   s   t  \n
 74  65  73  74  0a

或者:

$ echo "testing:"$'\001\011\n\bend test'  | od -vAn -tax1
  t   e   s   t   i   n   g   : soh  ht  nl  bs   e   n   d  sp
 74  65  73  74  69  6e  67  3a  01  09  0a  08  65  6e  64  20
  t   e   s   t  nl
 74  65  73  74  0a

我可以问一下,你为什么在末尾添加了“o”($'\157')吗?我以为这些是该命令的一些标志,并花了大约2个小时试图弄清楚这个额外的“o”从哪里来。 - Marcin K.
无论如何,感谢您的回答。它非常有帮助。 - Marcin K.

0

看起来你想将十六进制字符串转换为字节。xxd需要一个起始点(因为它用于修补二进制文件等)

string="626c610a"
echo "0: $string" | xxd -r

xxd 也会默默地跳过任何无效的十六进制数据,因此如果您得到空输出,请检查您的数据。


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