Bash
xxd 可以用來輸出十六進制數的二進製表示,而不是字元串嗎?
我想在命令行中從十六進制生成一個原始二進制數據包,以測試協議。我希望這樣做比編寫應用程序更簡單。
以下是目前發生的情況:
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 的單個字節(即 hexadecimalA
),您可以編寫(在 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
成為一個十六進制數字而不是兩個字元。它只是將其輸入視為一系列字元,而不管這些字元是什麼。字節序不影響字節。在字節通過串列線路傳輸之前,字節內的位順序完全是概念性的,即使這樣,它也只能用示波器或類似的東西才能看到。