2015/11/06

hexdumpのフォーマット

バイナリファイルを、C言語の配列形式に落とし込もうとした。
ちまちま打ち込むのは耐えられないので、ツールがあったはず、と記憶を頼りに探すも、見つからない。
あきらめて、バイナリダンプを出力するツールを使うことにした。
Linuxコマンド集 - 【hexdump】16進数や8進数で出力する:ITpro
  • 繰返し回数
  • バイト数
  • フォーマット
$ hexdump -e '"%07.7_ax  " 8/2 "%04x  " "\n"' sample

???
これで、確かに書かれているように、最初にオフセット、続けて16進数で2byteごとに8列並んだ出力になるのだが、何を意味しているかわからん・・・。

フォーマットの書きかたにならって、上記を分解する。
  • 1番目
    • フォーマット
      • "%07.7_ax "
  • 2番目
    • 繰返し回数
      • 8
    • バイト数
      • 2
    • フォーマット
      • "%04x "
  • 3番目
    • フォーマット
      • "\n"
これを言葉にすると、こうか。
  • 最初の_axのところは、オフセットの16進数表記で、%07.7は0パディングの7桁。
  • 次の8/2は、次のフォーマットを8回繰り返し、1回のバイト数は2byteという意味。
  • フォーマットの%04xは、0パディングの4桁16進数。
  • 最後は改行。
なるほど。

では、C言語の配列風にするとなると、こんな感じだろう。
  • オフセットはいらない
  • 1byteずつにする
  • 各バイトの先頭には0x、後ろにはコンマがいる
  • 1行は8列くらいが妥当か
えい!

$ hexdump -e '8/1 "0x%02x, " "\n"'  abcdef.bin
0x30, 0x82, 0x02, 0x5c, 0x02, 0x01, 0x00, 0x02,
0x81, 0x81, 0x00, 0xc7, 0x78, 0x20, 0x72...


おー、こういうのでいいんだよ、こういうので。

1 件のコメント:

  1. 弱点あり。
    終わりが8byteというか、列に満たないとこんな感じになる。

    0x00, 0x01, 0x , 0x , 0x , 0x , 0x , 0x ,

    返信削除

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。