Bash

xxd 可以用來輸出十六進制數的二進製表示,而不是字元串嗎?

  • July 6, 2020

我想在命令行中從十六進制生成一個原始二進制數據包,以測試協議。我希望這樣做比編寫應用程序更簡單。

以下是目前發生的情況:

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

我想要的是:

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

或者

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

因為我不確定所需的字節序。我希望能夠在必要時更改它。這是可以實現的嗎?

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

更好的選擇是printf '\x0A';printf 解釋格式字元串中的轉義序列,並且不輸出隱式換行符。(對於一個完全兼容 Posix 的解決方案,您需要一個八進制轉義:printf '\012'.printf應該適用於任何 Posix 兼容的 shell,但十六進制轉義是一個擴展。)另一個 bash 可能性是echo -n -e '\x0A'; (非標準)-e標誌要求 echo 解釋轉義序列。

echo '0A' | xxd -b不會輸出 hex 的等價物0A,因為xxd不知道您打算0A成為一個十六進制數字而不是兩個字元。它只是將其輸入視為一系列字元,而不管這些字元是什麼。

字節序不影響字節。在字節通過串列線路傳輸之前,字節內的位順序完全是概念性的,即使這樣,它也只能用示波器或類似的東西才能看到。

引用自:https://unix.stackexchange.com/questions/113491