hexdump 的なもの

なんとなく、知っているものをだらだらと。しかし、どいつもこいつも endian を指定できないのが悲しい。

hexdump

まぁ、正直にいうと使いにくい。1バイト単位で16進出力なんてのがやりたければフォーマット文字列を指定しないとできないのだが、このフォーマット指定文字列が難しい。
例えば、16バイトごとにアドレスを出力しながら、1バイト単位で16進出力、なんかだとこうなる。

% hexdump -e '"%07_ax" 16/1 " %02x" "\n"'

「"%07_ax"」 でアドレスを7桁16進で出力、「16/1 " %02x"」というのは1バイトずつ読み込んで、" %02x" で出力を16回繰り返し、「"\n"」は改行の出力。まぁ、分かりにくい。Ruby で書くとこんな感じ。

addr = 0
until ARGF.eof?
   printf '%07x', addr

   16.times do
      data = ARGF.read(1)
      break unless data
      printf " %02x", data.unpack('c').first
      addr += 1
   end

   printf "\n"
end

ややこしい代わりに、出力の制御は高機能。あと endian は多分マシン依存。

od

デフォルトでは8進出力、-x だと2バイト単位で16進出力。フォーマットの指定は hexdump と比べると遥かに簡単。

od -t x1

shinh さんは

od -A x -t x1z

らしい。
面倒なので、あとは man で。

xxd

vim についてくるやつ。個人的には一番良く使うのはこれ。
デフォルトでは2バイト単位で16進出力だが、1バイト単位にしたければ

xxd -g 1

とすればよい。でも、2バイト単位でも big endian なのであまり問題なかったりする。

most

pager の most がバイナリ表示をサポートしていたりする。

most -b

もしくは、実行してから 「:ob」で binary mode に切り替わる。

hexja

よさそうだけど、使ったことは無い。日本語を含むテキストを dump することが多い人はいいかも。