如何在保留不可打印字符的同时将十六进制转换为ASCII

我今天在调试时遇到了一些奇怪的问题,我设法将其追溯到一开始我忽略的事情。

看一下这两个命令的输出:

root@test:~# printf '%X' 10 | xxd -r -p | xxd -p
root@test:~# printf '%X' 43 | xxd -r -p | xxd -p
2b
root@test:~#

第一个 xxd 命令将十六进制转换为 ASCII。第二个将 ASCII 转换回十六进制。(43 十进制 = 2b 十六进制)。

不幸的是,它似乎是十六进制转换为ASCII并没有保留非打印字符。例如,原始十六进制“A”(十进制十进制 = A 十六进制),不知何故被xxd -r -p. 因此,当我执行逆操作时,我得到一个空结果。

我想做的是将一些数据输入到 minimodem 中。我需要通过位敲击有效地生成呼叫等待来电显示 (FSK)。我的 bash 脚本有正确的位,但如果我执行十六进制转储,则缺少不可打印的字符。不幸的是,minimodem 似乎只接受 ASCII 字符,我需要给它原始十六进制,但它似乎在转换中被吃掉了。是否有可能以某种方式保留这些字符?我不认为这是任何选择,所以想知道是否有更好的方法。

回答

xxd每个字节需要两个字符。一个A无效。做:

printf '%02X' 10 | xxd -r -p | xxd -p

如何在保留不可打印字符的同时将十六进制转换为 ASCII

使用xxd. 如果您的输入只有一个字符,请用首字母0.

ASCII 不保留不可打印的字符

它确实保留了任何字节,xxd是在 shell 中处理任何二进制数据的常用工具。

是否有可能以某种方式保留这些字符?

是 - 每字节两个字符的输入序列到xxd.


以上是如何在保留不可打印字符的同时将十六进制转换为ASCII的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>