odコマンドで16進ダンプを取る方法

バイナリデータなどのダンプを取りたい場合、多くの人は自分の使いやすい16進ダンプコマンドを利用するかと思います。例えばhexやhexdump、xdなんてコマンドがインストールされていて、それを使っている人が多いのかと思います。

しかし、ツールのインストールが制限されている環境で作業しなくてはいけない場合、デフォルトでインストールされているツールだけで作業する必要が出てきます。どんな環境でも大抵のUn*x環境でインストールされているツールという意味では、8進ダンプツールのodが一番標準的なものだと思いますが、8進ダンプは読みにくくて使いにくいと感じている人も多いのではないでしょうか。

それほど知られていませんが(「BINARY HACKS」には書いてありましたけど)、実はodで16進ダンプを表示する方法もあります。下記のように実行すれば、他の16進ダンプツールに近い結果が得られるかもしれません。

$ od -tx1z hoge.jpg|head -2
0000000 ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 48  >......JFIF.....H<
0000020 00 48 00 00 ff db 00 43 00 08 06 06 07 06 05 08  >.H.....C........<

インストールされているodがGNU odの場合にはこのようにASCIIでの表示も確認できますので、一般的な16進ダンププログラムに十分近い出力が得られます。 一方、残念ながら由緒正しいodは「z」が使えないため、下記のような形式でしか表示できません。

$ od -tx1 hoge.jpg |head -2
0000000    ff  d8  ff  e0  00  10  4a  46  49  46  00  01  01  01  00  48
0000020    00  48  00  00  ff  db  00  43  00  08  06  06  07  06  05  08

FreeBSDやSolaris環境の場合にはこれで我慢するか、格好悪いですが「-tx1c」で確認するしかありません。

$ od -tx1c hoge.jpg |head -4
0000000    ff  d8  ff  e0  00  10  4a  46  49  46  00  01  01  01  00  48
         377 330 377 340  \0 020   J   F   I   F  \0 001 001 001  \0   H
0000020    00  48  00  00  ff  db  00  43  00  08  06  06  07  06  05  08
          \0   H  \0  \0 377 333  \0   C  \0  \b 006 006  \a 006 005  \b

蛇足ですが、odコマンドは下記のようなオプションもあります。

-j skip
Skip skip bytes of the combined input before dumping. The
number may be followed by one of b, k or m which specify the
units of the number as blocks (512 bytes), kilobytes and
megabytes, respectively.

-N length
Dump at most length bytes of input.

大きいファイルの一部分をチェックしたいときには便利かもしれません。

コメント / トラックバック 4 件

#1 沢渡 みかげ 2007/08/24 15:02

-Axオプションを付けると,アドレス表示も16進数になります.
あわせて使うと便利かと思います.

#2 hnw 2007/08/25 01:31

コメントありがとうございます。確かに、アドレス表示が8進表記では不完全でした。私が普段はodを使っていないのがバレるような記事でお恥ずかしいです。

私は普段はhex(http://www.ganaware.jp/S/hex/)を使うことが多いです。日本語を含んだファイルの16進ダンプを取るときに重宝します。新作のhexjaは遅い気がしたのであまり使っていません。

#3 tumf 2007/08/25 14:09

emacs の hexl-modeしか使った事なかったので参考になりました

#4 m 2008/02/26 05:47

s/xd/xxd/

コメントする