Bagaimana cara membandingkan file biner untuk memeriksa apakah mereka sama?

186

Apa cara termudah (menggunakan alat grafis atau baris perintah di Ubuntu Linux) untuk mengetahui apakah dua file biner sama atau tidak (kecuali untuk prangko waktu)? Saya tidak perlu mengekstrak perbedaannya. Saya hanya perlu tahu apakah mereka sama atau tidak.

sawa
sumber
5
Sebuah pertanyaan yang meminta untuk menunjukkan bagaimana mereka berbeda: superuser.com/questions/125376/...
Ciro Santilli郝海东冠状病六四事件法轮功
2
Halaman manual untuk cmpsecara khusus mengatakan ia melakukan perbandingan byte demi byte sehingga merupakan standar saya untuk 2 file biner. diffadalah baris demi baris dan akan memberi Anda jawaban Ya / Tidak yang sama tetapi tentu saja tidak dump yang sama ke aliran keluar standar. Jika garisnya panjang karena mungkin bukan file teks maka saya lebih suka cmp. diffmemiliki keuntungan bahwa Anda dapat menentukan perbandingan direktori dan -rrekursi sehingga membandingkan beberapa file dalam satu perintah.
H2ONaCl

Jawaban:

180

Unix standar diffakan menunjukkan apakah file-nya sama atau tidak:

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

Jika tidak ada output dari perintah, itu berarti file tidak memiliki perbedaan.

Joe
sumber
5
diff tampaknya memiliki masalah dengan file yang sangat besar . Saya mendapat diff: memory exhaustedketika membandingkan dua file 13G.
Yongwei Wu
1
Output yang menarik. diffmemberitahu Anda mereka adalah "binary" fies. Karena semua file dapat dianggap biner, itu adalah pernyataan yang aneh.
H2ONaCl
7
Anda dapat melaporkan file yang identik dengan opsi: diff -s 1.bin 2.binatau diff --report-identical-files 1.bin 2.binIni menunjukkanFiles 1.bin and 2.bin are identical
Tom Kuschel
1
Tidak, itu akan mengatakan bahwa mereka "berbeda", jadi mereka tidak sama
Josef Klimuk
1
Saya memiliki dua executable, saya tahu mereka berbeda karena saya mengkompilasi dan menjalankannya, tetapi semua opsi diff dan cmp yang diberikan di sini menilai mereka identik. Mengapa? !!!
mirkastath
107

Gunakan cmpperintah. Ini akan keluar dengan baik jika mereka biner sama, atau itu akan mencetak di mana perbedaan pertama terjadi dan keluar.

bobjandal
sumber
9
Untuk kasus penggunaan OP menggambarkan IMHO cmplebih efisien daripada diff. Jadi saya lebih suka ini.
halloleo
5
Saya memiliki skrip shell yang berjalan:cmp $1 $2 && echo "identical" || echo "different"
steveha
2
apakah cmp berhenti ketika menemukan perbedaan pertama, dan menampilkannya atau melewati akhir file?
sop
cmpmemiliki mode "diam": -s, --quiet, --silent- suppress all normal output. Saya belum mencoba tetapi saya pikir itu akan berhenti pada perbedaan pertama jika ada.
Victor Yarema
90

Saya menemukan Visual Binary Diff adalah apa yang saya cari, tersedia di:

  • Ubuntu:

    sudo apt install vbindiff
    
  • Arch Linux:

    sudo pacman -S vbindiff
    
  • Mac OS X via MacPorts :

    port install vbindiff
    
  • Mac OS X via Homebrew:

    brew install vbindiff
    
shao.lo
sumber
1
Bagus ... Saya / saya / saya hanya ingin tahu apakah file berbeda; tetapi bisa melihat perbedaan yang tepat dengan mudah jauh lebih bermanfaat. Itu cenderung segfault ketika saya sampai di akhir file, tapi tidak apa-apa, masih berfungsi.
Jeremy
2
Sudah dikatakan beberapa kali, tetapi ini adalah program kecil yang hebat! (fyi juga di homebrew)
johncip
2
Ini harus menjadi jawaban yang diterima karena ini merupakan metode yang jauh lebih unggul daripada hasil perintah diff kanonik yang lembut dan tidak membantu.
Gearoid Murphy
1
Ini adalah alat terbaik untuk biner diff.
Carla Camargo
17

Gunakan sha1 untuk menghasilkan checksum:

sha1 [FILENAME1]
sha1 [FILENAME2]
Scott Presnell
sumber
3
Jika Anda hanya memiliki checksum untuk salah satu file, ini akan berguna, tetapi jika Anda memiliki kedua file pada disk ini tidak perlu. diffdan cmpkeduanya akan memberi tahu Anda jika mereka berbeda tanpa usaha ekstra.
johncip
1
Bukankah sha1sumbukan sha1?
kol
2
sha1 di NetBSD, sha1sum di Linux
Scott Presnell
2
Ada dua file yang akan mengembalikan hasil yang sama meskipun berbeda: shattered.io
mik
2
SHA1 sudah memiliki satu tabrakan publik ( shattered.io ) dan mungkin beberapa non-publik juga. Satu tabrakan dapat digunakan untuk menghasilkan banyak file yang bertabrakan. Gunakan SHA2 sebagai gantinya.
Michal Ambroz
12

Saya akhirnya menggunakan hexdump untuk mengkonversi file biner ke representasi hex dan kemudian membukanya di meld / kompare / alat diff lainnya. Tidak seperti Anda, saya setelah perbedaan dalam file.

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

meld tmp/hex1.txt tmp/hex2.txt
simotek
sumber
1
Gunakan hexdump -v -e '/1 "%02x\n"'jika Anda ingin melakukan diff dan melihat byte mana yang dimasukkan atau dihapus.
William Entriken
Meld juga berfungsi dengan file biner saat tidak dikonversi ke hex terlebih dahulu. Ini menunjukkan nilai hex untuk hal-hal yang tidak ada di set char, karakter normal, yang berguna dengan file biner yang juga mengandung beberapa teks ascii. Banyak yang melakukannya, setidaknya mulai dengan string ajaib.
Felix Dombek
7

Anda dapat menggunakan fungsi hash MD5 untuk memeriksa apakah dua file sama, dengan ini Anda tidak dapat melihat perbedaan dalam level rendah, tetapi merupakan cara cepat untuk membandingkan dua file.

md5 <filename1>
md5 <filename2>

Jika kedua hash MD5 (keluaran perintah) sama, maka kedua file tidak berbeda.

Rikki
sumber
7
Bisakah Anda jelaskan suara turun Anda? SHA1 memiliki 4 upvote, dan jika OP berpikir ada kemungkinan kedua file bisa sama atau serupa, kemungkinan tabrakan sedikit dan tidak layak untuk memilih MD5 tetapi memilih SHA1 selain karena Anda mendengar Anda harus hash Anda kata sandi dengan SHA1 bukan MD5 (itu masalah yang berbeda).
Rikki
2
tidak yakin tentang alasannya tetapi cmp murni akan lebih efisien daripada menghitung fungsi hash file dan membandingkannya (setidaknya untuk hanya 2 file)
Paweł Szczur
1
jika dua file berukuran besar dan pada disk yang sama (bukan ssd), varian md5 atau sha * mungkin lebih cepat karena disk dapat membaca dua file secara berurutan yang menyimpan banyak gerakan kepala
Daniel Alder
7
Saya downvoted karena Anda memposting varian minor dari solusi yang sebelumnya (buruk), padahal seharusnya komentar.
johncip
6

Gunakan perintah cmp. Lihat File Biner dan Memaksa Perbandingan Teks untuk informasi lebih lanjut.

cmp -b file1 file2
pengguna2008151314
sumber
1
-btidak membandingkan file dalam "mode biner". Ini sebenarnya "Dengan GNU cmp, Anda juga dapat menggunakan opsi -batau --print-bytesuntuk menampilkan representasi ASCII dari byte tersebut.". Ini persis seperti yang saya temukan menggunakan URL untuk manual yang telah Anda berikan.
Victor Yarema
Victor Yarema, saya tidak tahu apa yang Anda maksud dengan "mode biner". cmpsecara inheren perbandingan biner menurut saya. The -bpilihan hanya mencetak byte pertama yang berbeda.
H2ONaCl
4

Untuk menemukan cacat memori flash, saya harus menulis skrip ini yang menunjukkan semua blok 1K yang mengandung perbedaan (tidak hanya yang pertama seperti cmp -bhalnya)

#!/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

Keluaran:

   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 $

Penafian: Saya meretas script dalam 5 menit. Itu tidak mendukung argumen baris perintah juga tidak mendukung spasi dalam nama file

Daniel Alder
sumber
Saya mendapatkan "r: not found" (menggunakan GNU linux)
unseen_rider
@unseen_rider shell mana, baris mana? Silakan hubungi skrip yang digunakan sh -xuntuk debugging
Daniel Alder
Ini adalah dengan memanggil skrip dari terminal. Line adalah 9.
unseen_rider
@unseen_rider Saya tidak bisa membantu Anda dengan cara ini. Skripnya ok. Silakan kirim hasil debug Anda ke pastebin.com . Anda dapat melihat di sini apa yang saya maksud: pastebin.com/8trgyF4A . Juga, tolong beri tahu saya hasilreadlink -f $(which sh)
Daniel Alder
Perintah terakhir memberi /bin/dash. Saat ini membuat pasta pada pastebin.
unseen_rider
4

Beda dengan opsi-opsi berikut akan melakukan perbandingan biner untuk memeriksa apakah file berbeda sama sekali dan itu akan menghasilkan output jika file-file itu sama juga:

diff -qs {file1} {file2}

Jika Anda membandingkan dua file dengan nama yang sama di direktori yang berbeda, Anda dapat menggunakan formulir ini sebagai gantinya:

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

OS X El Capitan

DKroot
sumber
3

Coba beda

Jawaban singkat: jalankan diffdengan -ssakelar.

Jawaban panjang: baca terus di bawah.


Ini sebuah contoh. Mari kita mulai dengan membuat dua file dengan konten biner acak:

$ 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

Sekarang mari kita membuat salinan file pertama:

$ cp test1.bin copyoftest1.bin

Sekarang test1.bin dan test2.bin harus berbeda:

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

... dan test1.bin dan copyoftest1.bin harus identik:

$ diff test1.bin copyoftest1.bin

Tapi tunggu! Mengapa tidak ada output?!?

Jawabannya adalah: ini sesuai desain. Tidak ada output pada file yang identik.

Tetapi ada beberapa kode kesalahan:

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

$ echo $?
1


$ diff test1.bin copyoftest1.bin

$ echo $?
0

Sekarang untungnya Anda tidak perlu memeriksa kode kesalahan masing-masing dan setiap waktu karena Anda bisa menggunakan -s(atau --report-identical-files) beralih untuk membuat diff menjadi lebih verbose:

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

Radiff2 adalah alat yang dirancang untuk membandingkan file biner, mirip dengan cara perbedaan reguler membandingkan file teks.

Coba radiff2yang merupakan bagian dari radare2disassembler. Misalnya, dengan perintah ini:

radiff2 -x file1.bin file2.bin

Anda mendapatkan output dua kolom yang diformat dengan baik di mana perbedaan disorot.

Funnydman
sumber
1

Yang favorit saya menggunakan xxd hex-dumper dari paket vim:

1) menggunakan vimdiff (bagian dari vim)

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

2) menggunakan diff

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

Jika md5sum sama, binernya sama

Misalnya

md5sum new*
89c60189c3fa7ab5c96ae121ec43bd4a  new.txt
89c60189c3fa7ab5c96ae121ec43bd4a  new1.txt
root@TinyDistro:~# cat new*
aa55 aa55 0000 8010 7738
aa55 aa55 0000 8010 7738


root@TinyDistro:~# cat new*
aa55 aa55 000 8010 7738
aa55 aa55 0000 8010 7738
root@TinyDistro:~# md5sum new*
4a7f86919d4ac00c6206e11fca462c6f  new.txt
89c60189c3fa7ab5c96ae121ec43bd4a  new1.txt
abu
sumber
1
Tidak terlalu. Hanya kemungkinannya tinggi.
sawa
Berapa probabilitas gagal?
ashish
Langsing, tetapi lebih buruk daripada menggunakan beberapa varian diff, yang tidak ada alasan untuk memilihnya.
sawa
Anda harus mengubah hash MD5 ke SHA2 agar saran ini praktis. Laptop siapa pun hari ini dapat menghasilkan collision di MD5 dan berdasarkan awalan collision tunggal ini (2 file dengan ukuran yang sama, awalan yang sama dan MD5 yang sama) untuk menghasilkan jumlah file colliding yang tak terbatas (memiliki awalan yang sama, blok colliding yang berbeda, akhiran yang sama)
Michal Ambroz
-1

Ada cara yang relatif sederhana untuk memeriksa apakah dua file biner sama.

Jika Anda menggunakan input / output file dalam bahasa pemrograman; Anda dapat menyimpan setiap bit dari kedua file biner ke dalam array mereka sendiri.

Pada titik ini ceknya sesederhana:

if(file1 != file2){
    //do this
}else{
    /do that
}
Ahab Tanpa
sumber