web-dev-qa-db-ja.com

ポータブル1バイト/行の16進ダンプ

1行あたり1バイトのミニマリストが必要だとします[〜#〜] ascii [〜#〜] 16進ダンプ。 Linux using [〜#〜] gnu [〜#〜]odでは、これは機能します。

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

出力:

 66
 6f
 6f
 0a

しかし、それは[〜#〜] bsd [〜#〜]派生物では機能しません。[〜#〜] bsd [〜#〜]odutilにはさまざまなフラグがあります。

最も移植性の高い* nixメソッドは何ですか?それができない場合、利用可能な最善の方法は何ですか?

3
agc

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呼び出しで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よりも)でかなりのマージンがあります)でも最速です。 vimxxd)以下。

3

多分hexdump

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

これはBSDからのオリジナルです そのマニュアルはここにあります(BSDで)

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

1
Isaac

xxdはLinuxに存在し、 [〜#〜] bsd [〜#〜] 、および [〜#〜] osx [〜#〜]

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