
バイナリ ファイル (メモリ ダンプ) が 3 つあります。それぞれfile1
、、file2
と呼びますfile3
。ソフトウェアをデバッグしようとしていて、スイッチを切り替えています。
file1
= スイッチを切るfile2
= スイッチオンfile3
= スイッチを切る
file1
との間でどのバイトが変更されfile2
、その後 の と同じ値 ( file1
)に戻ったかを知る必要がありますfile3
。
間には無関係な変更が多数あるためfile1
、それだけではこのスイッチを切り替えたときに何が変化するのかを判断するのに不十分です。 、、、…から変化するエントロピーの一意のバイトを識別しようとしています。file2
diff
file1
2
3
xxd
、、、などdiff
のツールがあることは知っています。ただ、この問題に対してそれらをどのように使用するのが最善かわかりません。vimdiff
colordiff
答え1
file1
との間で変更されたバイトfile2
とそれぞれの値を知るには、 を使用しますcmp -l
。
cmp -l file1 file2 > changes12
file3
およびについても同様ですfile2
。コツは常に同じ方向(ここでは、オフからオンに切り替える)で調査することです。そのため、file2
最後に以下を配置します。
cmp -l file3 file2 > changes32
これで、同一の変更点を見つけることができます:
comm -12 changes12 changes32
出力は次のようになります (例):
1629 152 112
これは、バイト1629
(10 進数、番号は で始まる1
) が152
(8 進数)から112
(8 進数) に変更されたことを意味します。
ノート:
cmp -l
私の Ubuntu では、出力が「列化」されます。つまり、先頭にスペースのある行が印刷される可能性があり、最初の列の幅は入力サイズに依存します。一部の実装ではこれが行われない可能性があります。懸念事項がいくつかあります。- 元のファイルのサイズが異なる場合 (おそらくあなたの場合はそうではありません)、一方の
cmp
ファイルの 1 列目がもう一方のファイルよりも広くなる可能性があります。後のコンテキストでは、comm
これは受け入れられません。 にパイプすることで、出力を「デコラム化」できますawk '{print $1" "$2" "$3}'
。 - 出力が「列化」されていない場合(または「列化解除」されている場合)、
comm
ファイルがソートされていないというエラーが表示されることがあります。に保存する前に、sort
(ではなく) が必要です。これにより、予期しない順序が生成される場合があります(たとえば、異なるバイトが表示されます)。sort -n
changesAB
23
後異なるバイト) が発生しますが、の100453
出力を にパイプすることで修正できる可能性があります。comm
sort -n
- 元のファイルのサイズが異なる場合 (おそらくあなたの場合はそうではありません)、一方の
changes*
ファイルは巨大になる場合があります。中間的かつ一時的なものであるため、プロセス置換が適切なアプローチとなる場合があります。ただし、これは POSIX ではありません。# Korn shell syntax example comm -12 <(cmp -l file1 file2) <(cmp -l file3 file2)
からの出力を、
comm
さらに別の および の別の出力と組み合わせて使用することで、cmp
無関係な変更をより適切に除外できます。comm -12 changes12 changes32 > result1 cmp -l file4 file5 | comm -12 - result1 > result2 cmp -l file6 file5 | comm -12 - result2 > result3
でも覚えておいて:
- 常に
cmp
同じ方向に切り替える必要があります (例: オフからオンに切り替える)。 - これに注意してください:stdinとstdoutに同じファイルを使用すると空のファイルが生成されます。
… | comm -12 - result1 > result1
間違っている。
- 常に
ドキュメンテーション:
答え2
私は Windows ユーザーであり、3 つのファイル (一度に 2 つ) を相互に比較するなど、ファイルの比較に長年 Beyond Compare を使用してきました。
Beyond Compare には Linux ディストリビューションもあるようなので、チェックしてみるといいかもしれません。
https://www.scootersoftware.com/download.php?zz=kb_linux_install
Windows 版には、相違点だけを表示するオプションや、役に立つかもしれない他の多くの機能があることは知っています。3 方向比較機能があるかどうかは覚えていません。
私は彼らの開発者でも営業でもありませんが、ただソフトウェアがとても好きなだけです。
答え3
Kamil からの返答に基づいて、必要なものを取得するためにこれを使用しました。
cmp -l file1 file2 | awk '{print $1" "$2" "$3}' | sort > changes_12
cmp -l file3 file2 | awk '{print $1" "$2" "$3}' | sort > changes_32
comm -12 変更_12 変更_32 > 共通変更