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

The*_*eer 11 bash conversion binary

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

以下是目前发生的情况:

echo '0A' | xxd  -b
0000000: 00110000 01000001 00001010
Run Code Online (Sandbox Code Playgroud)

我想要的是:

echo '0A' | xxd  -b
0000000: 00001010    
Run Code Online (Sandbox Code Playgroud)

或者

echo '0A' | xxd  -b
0000000: 01010000    
Run Code Online (Sandbox Code Playgroud)

因为我不确定所需的字节顺序。我希望能够在必要时更改它。这是可以实现的吗?

ric*_*ici 12

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

echo -n $'\x0A'
      ^ ^  ^
      | |  |
      | |  +-- `\x` indicates a hexadecimal escape
      | +----- Inside a $' string, escapes are interpreted
      +------- -n suppresses the trailing newline
Run Code Online (Sandbox Code Playgroud)

更好的选择是printf '\x0A';printf 解释格式字符串中的转义序列,并且不输出隐式换行符。(对于完全兼容 Posix 的解决方案,您需要一个八进制转义:printf '\012'.printf应该适用于任何 Posix 兼容的 shell,但十六进制转义是一种扩展。)另一种 bash 可能性是echo -n -e '\x0A'; (非标准)-e标志要求 echo 解释转义序列。

echo '0A' | xxd -b不会输出等效的 hex 0A,因为xxd不知道您打算0A成为十六进制数字而不是两个字符。它只是将其输入作为一系列字符,而不管这些字符是什么。

字节序不影响字节。在字节通过串行线路传输之前,字节内的位顺序完全是概念性的,即使如此,它也只能用示波器或类似的东西看到。


小智 7

如果您想要一串十六进制数字的二进制输出,xxd -r -p. 例如:

 $ echo '0A0B0C0D' | xxd -r -p | xxd -b
 0000000: 00001010 00001011 00001100 00001101                    ....
Run Code Online (Sandbox Code Playgroud)

将 0A0B0C0D 转换为四字节的二进制(第一次调用 xxd),然后将其转换回可打印(第二次调用)。你说你想要一个二进制输出,但你正在尝试的例子是一个可打印的表示。

正如您在第二个示例中暗示的那样,我不知道字节顺序在半字节级别上有什么不明确的地方。xxd 中的转换一次是一个纯字节,不假设它们代表任何特定的多字节数。