便攜式每行一位元組十六進位轉儲

便攜式每行一位元組十六進位轉儲

假設我們想要每行一個極簡的一個位元組ASCII碼十六進制轉儲。在下面Linux使用GNU od,這有效:

echo foo | od -An -tx1 -w1 -v

輸出:

 66
 6f
 6f
 0a

但這不起作用BSD衍生品,因為BSD odutil 有不同的標誌。

什麼東西最便攜*尼克斯方法?如果做不到這一點,最好的可用方法是什麼?

答案1

od是一個標準命令。在 中od -An -tx1 -w1 -v,唯一不是 POSIX 的是-w選項。

您可以將其替換為:

od -An -vtx1 | LC_ALL=C tr -cs '0-9a-fA-F' '[\n*]' | grep .

它可以在任何 POSIX 相容的系統中運作,並且至少在 FreeBSD 上運作:

$ echo test | od -An -vtx1 | LC_ALL=C tr -cs 0-9a-fA-F '[\n*]' | grep .
74
65
73
74
0a

或透過一次sed調用來替換tr+ grep

od -An -vtx1 | sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//;/./!d
s/[[:blank:]]\{1,\}/\
/g'

(或者

od -An -vtx1 | sed -n 's/[[:blank:]]*\([^[:blank:]]\{2\}\)[[:blank:]]*/\1\
/g;s/\n$//p'

使用perl(不是 POSIX 命令,但在除嵌入式系統之外的任何系統上都普遍存在):

perl -ne '
  BEGIN{$/ = \8192; $, = $\ = "\n"}
  print  unpack "(H2)*", $_'

在我的測試中,這也是 3 個中最快的(與 GNU 相比od),除了小檔案(也不hexdumpvim's xxd)之外,它的速度有很大優勢。

答案2

或許hexdump

$ echo foo | hexdump -v -e '1/1 "%02x\n"'
66
6f
6f
0a

這是來自 BSD 的原始版本它的手冊在這裡(BSD 版本)

然而,上面顯示的範例是在 Linux 中運行的。

答案3

xxd存在於Linux中,BSD, 和作業系統X:

echo foo | xxd -p -c 1
66
6f
6f
0a

相關內容