質問: linuxでバイナリファイルを比較する方法 2つのバイナリファイルを比較して出力を次の形式で取得する必要があります。<fileoffset-hex> <file1-byte-hex> <file2-byte-hex>異なるバイトごとに。 file1.binが 00 90 00 11 バイナリ形式で、file2.binは 00 91 00 10 こんなものを手に入れたい 00000001 90 91 00000003 11 10 linuxでこれを行う方法はありますか?私はcmp -lについて知っていますが、オフセットには10進法を使い、バイトには8進法を使いますが、避けたいのです。
回答: バイト追加/削除に有効なメソッドdiff <(od -an -tx1 -w1 -v file1) \ <(od -an -tx1 -w1 -v file2) 64バイトを1回削除してテストケースを生成します。for i in `seq 128`; do printf "%02x" "$i"; done | xxd -r -p > file1 for i in `seq 128`; do if [ "$i" -ne 64 ]; then printf "%02x" $i; fi; done | xxd -r -p > file2 出力:64d63 < 40 asciiバージョンのキャラクターも見たい場合は、bdiff() ( f() ( od -an -tx1c -w1 -v "$1" | paste -d '' - - ) diff <(f "$1") <(f "$2") ) bdiff file1 file2 出力:64d63 < 40 @ ubuntu 16.04でテスト済み。私はodname__よりxxdname__を好みます。 はposix ですが、xxdname__はそうではありません(vimに付属) awkname__なしで住所列を削除するための-anがあります。 コマンドの説明 -anはアドレス列を削除します。そうでなければすべての行がバイトの追加/削除の後で異なるだろうこれは重要です。 -w1は1行に1バイトを入れるので、diffはそれを消費することができます。 1行に1バイト、または削除後のすべての行が位相がずれて異なる場合があります。残念ながら、これはposixではなく、gnuに存在します。 -tx1はあなたが望む表現です、あなたが1行につき1バイトを保つ限り、どんな可能な値にでも変更してください。 -vはアスタリスクの繰り返しの省略形*を防ぎます。 paste -d '' - -は2行ごとに結合します。これは、hexとasciiが別々の隣接行に入るために必要です。 https://stackoverflow.com/questions/8987257/concatenating-every-other-line-with-the-next から取得 内部関数bdiffname__の範囲を制限するために()の代わりにfname__を定義するために括弧{}を使用します。 https://stackoverflow.com/questions/8426077/how-to-define-a-functionも参照してください。インバースイン関数 また見なさい: https://unix.stackexchange.com/questions/59849/diff-binary-files-of-different-sizes https://stackoverflow.com/questions/8385618/using-cmp-to-compare-two-binaries