可以使用xxd输出十六进制数字而不是字符串的二进制表示吗?


10

我想在命令行中从十六进制生成原始二进制数据包,以测试协议。我希望通过这种方式比编写应用程序更简单。

这是当前发生的情况:

echo '0A' | xxd  -b
0000000: 00110000 01000001 00001010

我想拥有的是:

echo '0A' | xxd  -b
0000000: 00001010    

要么

echo '0A' | xxd  -b
0000000: 01010000    

由于我无法确定所需的耐力。我希望能够在必要时进行更改。这可以实现吗?

Answers:


9

echo '0A'产生三种字符:0 A NL; xxd -b然后将以二进制形式打印这三个字符。如果您只想要值为10(即十六进制A)的单个字节,则可以编写(以bash表示):

echo -n $'\x0A'
      ^ ^  ^
      | |  |
      | |  +-- `\x` indicates a hexadecimal escape
      | +----- Inside a $' string, escapes are interpreted
      +------- -n suppresses the trailing newline

更好的选择是printf '\x0A'; printf解释格式字符串中的转义序列,并且不输出隐式换行符。(这是符合POSIX标准的解决方案,它应该在任何的Posix兼容的外壳工作)。另一种可能性bash的是echo -n -e '\x0A'; (非标准)-e标志要求回显来解释转义序列。

echo '1' | xxd -b不会输出与hex等效的结果50,因为xxd不知道这0A是一个十六进制数,1而不是。另外,该字符的ascii代码为1hex 31,而不是50

字节序不影响字节。字节内部的位顺序完全是概念性的,直到该字节通过串行线路传输为止,即使那样,也只能在示波器或类似设备上才能看到。


对不起50。这是一个错字。立即修复
TheMeaningfulEngineer 2014年

7

如果要二进制输出为一串十六进制数字,xxd -r -p。例如:

 $ echo '0A0B0C0D' | xxd -r -p | xxd -b
 0000000: 00001010 00001011 00001100 00001101                    ....

将0A0B0C0D转换为四个字节的二进制文件(第一次调用xxd),然后将其转换回可打印的状态(第二次调用)。您说想要二进制输出,但是您尝试的示例是可打印的表示形式。

正如您在第二个示例中所暗示的那样,我不知道字节序在哪儿都不清楚。xxd中的转换一次是一个纯字节,并不假定它们代表任何特定的多字节数字。


2

是的,您可以xxd这样做,但是您可能不喜欢输入格式。在您的示例中,0x0a是ASCII换行符的十六进制值。您可以创建一个只包含一个换行符的文件,然后用于xxd创建清单:

$ xxd one_line_file
0000000: 0a                                       .

xxd如果给它适当的标志,则可以从该输出中得到一个换行符:

$ echo "0000000: 0a" | xxd -r > another_one_line_file
$ xxd another_one_line_file
0000000: 0a 

xxd具有非常不错的输出格式,我认为使用文本编辑器创建数据包然后使用xxd -r二进制文件不会太麻烦。。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.