ポータブルな 1 行あたり 1 バイトの 16 進ダンプ

ポータブルな 1 行あたり 1 バイトの 16 進ダンプ

1行あたり1バイトの最小限の文字数が欲しいとしますアスキー16進ダンプ。リナックス使用してGNU od、これは機能します:

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

出力:

 66
 6f
 6f
 0a

しかし、それはうまくいかないBSDA のデリバティブは、BSDA の odutil には異なるフラグがあります。

最も持ち運びやすいのは*nix方法はありますか? それができない場合、利用可能な最良の方法は何ですか?

答え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

または、1 回の呼び出しで+ をsed置き換えます。trgrep

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) xxd

答え2

多分hexdump

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

これはBSDから派生したものであるマニュアルはここにあります(BSD形式)

ただし、上記の例は Linux で実行されました。

答え3

xxdLinuxに存在する、BSDA の、 そしてOSX:

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

関連情報