2013年9月7日土曜日

バイナリデータを cmp コマンドで比較して、差分を 16 進数で表示

cmp コマンドは、違いのあるバイトのオフセット (10進数) とその値 (8進数) を表示してくれるけど、
欲しいのは、全てが 16 進数の値。
それなら、出力結果を awk で変換するといい。
8 進数 → 16 進数の変換は、先頭に 0 を付けて、16 進数にすれば OK。

$ cmp -l hoge1.bin hoge2.bin | awk '{printf("0x%08X %02X %02X\n", $1, strtonum("0"$2), strtonum("0"$3))}'

0x00000001 26 27
0x00000003 CA CB
0x00000005 A6 A7
0x00000007 D6 D7
0x00000009 6A 6B
0x0000000b CA CB

strtonum は、gawk の拡張機能。

● バイナリ, binary, 比較, 差分, cmp, diff, compare, 16 進数, 10 進数, 8 進数, hex, strtonum

2 件のコメント:

匿名 さんのコメント...

ありがとうございます、非常に参考になりました。
1点だけ補足します。
cmpは不一致のバイト位置が0始まりではなく1始まりですので
0x00000001 26 27
・・・・
になりますね。

まさお さんのコメント...

コメントありがとうございます!
修正しておきました (汗)