web-dev-qa-db-ja.com

バイナリファイルを比較してそれらが同じかどうかを確認する方法

2つのバイナリファイルが同じかどうかを知る最も簡単な方法(Ubuntu Linuxではグラフィカルツールまたはコマンドラインを使用)は何ですか(タイムスタンプを除く)。実際に違いを抽出する必要はありません。私はただそれらが同じかどうかを知る必要があります。

140
sawa

標準のunix diffは、ファイルが同じかどうかを示します。

[me@Host ~]$ diff 1.bin 2.bin
Binary files 1.bin and 2.bin differ

コマンドからの出力がない場合は、ファイルに違いがないことを意味します。

141
Joe

cmpコマンドを使用してください。 2進数が等しい場合は、これはきれいに終了するか、最初の違いが発生した場所に出力して終了します。

87
bobjandal

Visual Binary Diff が私が探していたものでした。

  • Ubuntu:apt-get install vbindiff
  • Arch Linux:pacman -S vbindiff
  • Mac OS X:port install vbindiff経由で MacPorts
  • Mac OS X:自作によるbrew install vbindiff
76
shao.lo

チェックサムを生成するにはsha1を使用してください。

sha1 [FILENAME1]
sha1 [FILENAME2]
16
Scott Presnell

私はhexdumpを使ってバイナリファイルをそこのhex表現に変換してから、それらをmeld/kompare /その他のdiffツールで開きました。あなたとは異なり、私はファイルの違いの後にいました。

hexdump tmp/Circle_24.png > tmp/hex1.txt
hexdump /tmp/Circle_24.png > tmp/hex2.txt

meld tmp/hex1.txt tmp/hex2.txt
11
simotek

Cmpコマンドを使用してください。詳細は バイナリファイルとテキストの強制比較 を参照してください。

cmp -b file1 file2
6
user2008151314

md5 <filename1>

md5 <filename2>

それらが同じであるかどうかを確認してください:-)

5
Rikki

以下のオプションを指定したdiffは、ファイルがまったく異なるかどうかを確認するためにバイナリ比較を行い、ファイルが同じであれば出力します。

diff -qs {file1} {file2}

異なるディレクトリにある同じ名前の2つのファイルを比較している場合は、代わりにこの形式を使用できます。

diff -qs {file1} --to-file={dir2}

OS X El Capitan

4
DKroot

フラッシュメモリの欠陥を見つけるために、私は違いを含むすべての1Kブロックを示すこのスクリプトを書かなければなりませんでした(cmp -bのように最初のものだけではありません)

#!/bin/sh

f1=testinput.dat
f2=testoutput.dat

size=$(stat -c%s $f1)
i=0
while [ $i -lt $size ]; do
  if ! r="`cmp -n 1024 -i $i -b $f1 $f2`"; then
    printf "%8x: %s\n" $i "$r"
  fi
  i=$(expr $i + 1024)
done

出力:

   2d400: testinput.dat testoutput.dat differ: byte 3, line 1 is 200 M-^@ 240 M- 
   2dc00: testinput.dat testoutput.dat differ: byte 8, line 1 is 327 M-W 127 W
   4d000: testinput.dat testoutput.dat differ: byte 37, line 1 is 270 M-8 260 M-0
   4d400: testinput.dat testoutput.dat differ: byte 19, line 1 is  46 &  44 $

免責事項:私は5分で台本をハッキングしました。コマンドライン引数もサポートしていませんし、ファイル名のスペースもサポートしていません。

4
Daniel Alder

Diffを試してください-s

簡単な答え:-sスイッチを付けてdiffを実行します。

長い答え:以下を読んでください。


これが一例です。ランダムなバイナリコンテンツを持つ2つのファイルを作成することから始めましょう。

$ dd if=/dev/random bs=1k count=1 of=test1.bin
1+0 records in
1+0 records out
1024 bytes (1,0 kB, 1,0 KiB) copied, 0,0100332 s, 102 kB/s


$ dd if=/dev/random bs=1k count=1 of=test2.bin
1+0 records in
1+0 records out
1024 bytes (1,0 kB, 1,0 KiB) copied, 0,0102889 s, 99,5 kB/s

それでは、最初のファイルのコピーを作成しましょう。

$ cp test1.bin copyoftest1.bin

Test1.binとtest2.binは違うはずです。

$ diff test1.bin test2.bin
Binary files test1.bin and test2.bin differ

...とtest1.binとcopyoftest1.binは同じである必要があります。

$ diff test1.bin copyoftest1.bin

ちょっと待って!何も出力されないのはなぜですか。

答えは次のとおりです。これは仕様によるものです。同一ファイルに出力はありません。

しかし、さまざまなエラーコードがあります。

$ diff test1.bin test2.bin
Binary files test1.bin and test2.bin differ

$ echo $?
1


$ diff test1.bin copyoftest1.bin

$ echo $?
0

幸いなことに、エラーコードを毎回チェックする必要はありません。なぜなら、diffをより冗長にするために -s(または--report-identical-files)スイッチ を使用するだけでよいからです。

$ diff -s test1.bin copyoftest1.bin
Files test1.bin and copyoftest1.bin are identical
3
StackzOfZtuff

Radiff2 は、通常のdiffがテキストファイルを比較するのと同じように、バイナリファイルを比較するように設計されたツールです。

radiff2逆アセンブラの一部であるradare2を試してください。たとえば、このコマンドでは:

radiff2 -x file1.bin file2.bin

違いが強調表示されている場所では、かなり整形された2列の出力が得られます。

1
FUNNYDMAN

私のお気に入りのものはvimパッケージのxxd hex-dumperを使っています。

1)vimdiff(vimの一部)を使う

#!/bin/bash
FILE1="$1"
FILE2="$2"
vimdiff <( xxd "$FILE1" ) <( xxd "$FILE2" )

2)diffを使う

#!/bin/bash
FILE1=$1
FILE2=$2
diff -W 140 -y <( xxd $FILE1 ) <( xxd $FILE2 ) | colordiff | less -R -p '  \|  '
0
Michal Ambroz