Portability
攜帶式每行一個字節的十六進制轉儲
假設我們想要一個極簡的每行一個字節的ASCII十六進制轉儲。在使用GNU的**Linux下,這是有效的:
od
echo foo | od -An -tx1 -w1 -v
輸出:
66 6f 6f 0a
但這不適用於BSD衍生產品,因為BSD
od
util 具有不同的標誌。最便攜的**nix*方法是什麼?如果做不到這一點,最好的可用方法是什麼?
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
),除了小文件(也比hexdump
,不是vim
’sxxd
)之外的任何東西都有很大的差距。