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

新手上路,请多包涵

假设我有一个字符串 5a

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

我需要找到一个 Linux shell 命令,该命令将采用十六进制字符串并输出十六进制字符串所代表的 ASCII 字符。

所以如果我这样做:

 echo 5a | command_im_looking_for

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

 Z

原文由 Krystian Cybulski 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.4k
2 个回答
echo -n 5a | perl -pe 's/([0-9a-f]{2})/chr hex $1/gie'

请注意,这不会跳过非十六进制字符。如果您只想要十六进制(原始字符串中没有空格等):

 echo 5a | perl -ne 's/([0-9a-f]{2})/print chr hex $1/gie'

此外, zshbashecho 中原生支持此功能:

 echo -e '\x5a'

原文由 bdonlan 发布,翻译遵循 CC BY-SA 2.5 许可协议

我曾经用 xxd 做到这一点:

 echo -n 5a | xxd -r -p

但后来我意识到在 Debian/Ubuntu 中,xxd 是 vim-common 的一部分,因此可能不会出现在最小系统中。为了避免使用 Perl(恕我直言,这也不是最小系统的一部分),我最终使用了 sed、xargs 和 printf,如下所示:

 echo -n 5a | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf

大多数情况下,我只想转换几个字节,这样的任务没问题。该解决方案相 对于 ghostdog74 解决方案的优势在于,它可以自动转换任意长度的十六进制字符串。使用 xargs 是因为 printf 不从标准输入读取。

原文由 josch 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题