web-dev-qa-db-ja.com

3つのバイナリファイルを比較して、1と2の間で変更され、2と3の間で変更されたものだけを表示するにはどうすればよいですか?

3つのバイナリファイル(メモリダンプ)があります。それらをfile1file2file3と呼びます。いくつかのソフトウェアをデバッグしようとしていますが、スイッチを切り替えています。

  • file1 =スイッチをオフにします

  • file2 =スイッチをオンにします

  • file3 =スイッチをオフにします

file1file2の間でどのバイトが変更されたかを知る必要があります。その後、file1の同じ値(file3として)に戻りました。

file1file2の間には無関係な変更がたくさんあるため、このスイッチを切り替えたときに何が変更されているかを判断するには、diffだけでは不十分です。識別しようとしています。 file123、…から変化するエントロピーの一意のバイト

xxddiffvimdiffcolordiffなどのツールがあることは知っています。この問題にそれらをどのように使用するのが最善かわかりません。

2
authur1234

file1file2の間で変更されたバイトとそれぞれの値を知るには、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進数)に変更されたことを意味します。


ノート:

  • 私のUbuntuのcmp -lは、その出力を「列化」します。これは、先頭にスペースが含まれる行を印刷する可能性があることを意味します。最初の列の幅は入力サイズによって異なります。いくつかの実装はこれを行わないかもしれないと思います。懸念事項はほとんどありません:
    • 元のファイルのサイズが異なる場合(おそらくあなたの場合ではない)、一方のcmpがもう一方よりも広い最初の列を生成する可能性があります。後のcommのコンテキストでは、これは受け入れられません。 awk '{print $1" "$2" "$3}'にパイプすることで、出力を「非列化」できます。
    • 出力が「列化」されていない(または「列化解除」されている)場合、commはファイルがソートされていないと文句を言うことがあります。 sortに保存する前に、changesABsort -nではない)が必要です。これにより、予期しない順序が生成される可能性があります(たとえば、異なるバイト23が表示されますafter異なるバイト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
    

    でも覚えておいて:


ドキュメンテーション:

0

カミルからの応答に基づいて、私はこれを使用して必要なものを取得しました。

cmp -l file1 file2 | awk '{print $ 1 "" $ 2 "" $ 3}' |並べ替え> changes_12

cmp -l file3 file2 | awk '{print $ 1 "" $ 2 "" $ 3}' |並べ替え> changes_32

comm -12changes_12changes_32> common_changes

0
authur1234

私はWindowsユーザーであり、3つのファイル(一度に2つ)を相互に比較するなど、ファイルの比較にBeyondCompareを長年使用しています。

Beyond CompareにもLinuxディストリビューションがあるようですので、チェックしてみてください。

https://www.scootersoftware.com/download.php?zz=kb_linux_install

Windowsバージョンには、違いだけでなく、役立つ可能性のある他の多くの機能を表示するオプションがあることを私は知っています。 3通りの比較があるかどうか思い出せません。

私は彼らの開発や販売ではありません。ソフトウェアが大好きです。

0
computercarguy