Cum se compară fișierele binare pentru a verifica dacă sunt identice? (Programare, Fișier, Binar, Comparați, Diff)

sawa a intrebat.

Care este cel mai simplu mod (folosind un instrument grafic sau o linie de comandă pe Ubuntu Linux) de a ști dacă două fișiere binare sunt identice sau nu (cu excepția marcajelor de timp)? Nu am nevoie să extrag efectiv diferența. Am nevoie doar să știu dacă sunt identice sau nu.

Comentarii

  • O întrebare care cere să arate cum sunt diferite: superuser.com/questions/125376/… –  > Por Ciro Santilli新疆棉花TRUMP BAN BAD.
  • Pagina de manual pentru cmp spune în mod specific că face o comparație octet cu octet, așa că aceasta este opțiunea mea implicită pentru 2 fișiere binare. diff este linie cu linie și vă va da același răspuns de tip Da/Nu, dar, desigur, nu aceeași descărcare pe fluxul de ieșire standard. În cazul în care liniile sunt lungi, pentru că poate nu sunt fișiere text, atunci aș prefera cmp. diff are avantajul că puteți specifica o comparație a directoarelor și că -r pentru recursivitate, comparând astfel mai multe fișiere într-o singură comandă. –  > Por H2ONaCl.
14 răspunsuri
Joe

Standardul unix diff va arăta dacă fișierele sunt identice sau nu:

[[email protected] ~]$ diff 1.bin 2.bin
Binary files 1.bin and 2.bin differ

Dacă nu există nici o ieșire de la comandă, înseamnă că fișierele nu au diferențe.

Comentarii

  • diff pare să aibă probleme cu foarte mari foarte mari. Am primit un mesaj diff: memory exhausted când am comparat două fișiere de 13G. –  > Por Yongwei Wu.
  • Ieșire interesantă. diff vă spune că sunt fișiere „binare”. Din moment ce toate fișierele pot fi considerate ca fiind binare, aceasta este o afirmație ciudată. –  > Por H2ONaCl.
  • Puteți raporta fișiere identice cu opțiunea: diff -s 1.bin 2.bin sau diff --report-identical-files 1.bin 2.bin Aceasta arată Files 1.bin and 2.bin are identical –  > Por Tom Kuschel.
  • Nu, se va spune că sunt „diferite”, deci nu sunt identice –  > Por Josef Klimuk.
  • Am două executabile, știu că sunt diferite pentru că le-am compilat și le-am rulat, dar toate opțiunile de diff și cmp date aici le judecă identice. De ce?!!! –  > Por mirkastath.
bobjandal

Utilizați cmp comanda. Aceasta fie va ieși în mod curat dacă sunt egale binar, fie va tipări unde apare prima diferență și va ieși.

Comentarii

  • Pentru cazul de utilizare descris de OP, IMHO cmp este mai eficientă decât diff. Așadar, aș prefera acest lucru. –  > Por halloleo.
  • Am un script shell care rulează: cmp $1 $2 && echo "identical" || echo "different" –  > Por steveha.
  • cmp-ul se oprește când a găsit prima diferență și o afișează sau merge până la sfârșitul fișierelor? –  > Por sop.
  • cmp are modul „silent”: -s, --quiet, --silentsuppress all normal output. Nu am testat încă, dar cred că se va opri la prima diferență, dacă există una. –  > Por Victor Yarema.
shao.lo

Am găsit Visual Binary Diff era ceea ce căutam, disponibil pe:

  • Ubuntu:

    sudo apt install vbindiff
    
  • Arch Linux:

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

    port install vbindiff
    
  • Mac OS X prin Homebrew:

    brew install vbindiff
    

Comentarii

  • Nice… Credeam/că vreau doar să știu dacă fișierele diferă; dar faptul că pot vedea cu ușurință diferențele exacte este mult mai util. Avea tendința de a face segfault când ajungeam la sfârșitul fișierului, dar nu contează, tot funcționa. –  > Por Jeremy.
  • S-a mai spus de câteva ori, dar acesta este un mic program grozav! (pentru informare, de asemenea, pe homebrew) – –  > Por johncip.
  • Acesta ar trebui să fie răspunsul acceptat, deoarece este o metodă mult superioară față de rezultatul insipid și nefolositor al comenzii canonice diff. –  > Por Gearoid Murphy.
  • Acesta este cel mai bun instrument pentru diff binar. –  > Por Carla Camargo.
Scott Presnell

Utilizați sha1 pentru a genera suma de control:

sha1 [FILENAME1]
sha1 [FILENAME2]

Comentarii

  • Dacă ați avea o sumă de control doar pentru unul dintre fișiere, acest lucru ar fi util, dar dacă aveți ambele fișiere pe disc, nu este necesar. diff și cmp vă vor spune dacă sunt diferite fără niciun efort suplimentar. –  > Por johncip.
  • Nu este sha1sum în loc de sha1? –  > Por kol.
  • sha1 pe NetBSD, sha1sum pe Linux –  > Por Scott Presnell.
  • Există două fișiere care vor returna același rezultat în ciuda faptului că sunt diferite: shattered.io –  > Por mik.
  • SHA1 are deja o coliziune publică (shattered.io) și probabil și unele nepublice. O singură coliziune poate fi folosită pentru a genera nenumărate fișiere care intră în coliziune Folosiți SHA2 pentru hashing în schimb, vă rog. –  > Por Michal Ambroz.
simotek

Am sfârșit prin a folosi hexdump pentru a converti fișierele binare în reprezentarea lor hexagonală și apoi le-am deschis în meld / kompare / orice alt instrument de diferență. Spre deosebire de tine, eu căutam diferențele din fișiere.

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

meld tmp/hex1.txt tmp/hex2.txt

Comentarii

  • Utilizați hexdump -v -e '/1 "%02x
    "'
    dacă doriți să faceți diff și să vedeți exact ce octeți au fost introduși sau eliminați. –  > Por William Entriken.
  • Meld funcționează și cu fișiere binare atunci când acestea nu sunt convertite mai întâi în hexazecimal. Afișează valorile hexagonale pentru lucrurile care nu se află în setul de caractere, în rest caractere normale, ceea ce este util în cazul fișierelor binare care conțin și text ascii. Multe dintre acestea, cel puțin încep cu un șir magic. –  > Por Felix Dombek.
Rikki

Puteți folosi funcția hash MD5 pentru a verifica dacă două fișiere sunt identice, cu aceasta nu puteți vedea diferențele la nivel scăzut, dar este o modalitate rapidă de a compara două fișiere.

md5 <filename1>
md5 <filename2>

Dacă ambele hash-uri MD5 (ieșirea comenzii) sunt identice, atunci, cele două fișiere nu sunt diferite.

Comentarii

  • Poți să ne explici, te rog, cum se explică voturile tale negative? SHA1 are 4 voturi în plus, iar dacă OP crede că există o șansă ca cele două fișiere să fie identice sau similare, șansele de coliziune sunt mici și nu merită să votezi în minus MD5 și să votezi în plus SHA1, decât pentru că ai auzit că ar trebui să folosești parolele cu SHA1 în loc de MD5 (asta e o problemă diferită). –  > Por Rikki.
  • nu sunt sigur de motiv, dar un cmp pur va fi mai eficient decât calcularea oricărei funcții hash a fișierelor și compararea lor (cel puțin pentru doar 2 fișiere) – –  > Por Paweł Szczur.
  • dacă cele două fișiere sunt mari și se află pe același disc (nu ssd), varianta md5 sau sha* ar putea fi mai rapidă, deoarece discurile pot citi cele două fișiere secvențial, ceea ce economisește multe mișcări de cap. –  > Por Daniel Alder.
  • Am dat downvoted pentru că ai postat o variantă minoră a unei soluții anterioare (proaste), când ar fi trebuit să fie un comentariu. –  > Por johncip.
  • Cel mai rapid mod de a verifica fișiere mari 🙂 Mulțumesc mult –  > Por Sumeet Patil.
utilizator2008151314

Utilizați comanda cmp. Consultați Fișiere binare și forțarea comparațiilor de text pentru mai multe informații.

cmp -b file1 file2

Comentarii

  • -b nu compară fișiere în „modul binar”. De fapt, „Cu GNU cmp, , puteți utiliza, de asemenea, funcția -b sau --print-bytes pentru a afișa reprezentarea ASCII a acelor octeți.”. Este exact ceea ce am găsit folosind URL-ul la manualul pe care l-ați furnizat. –  > Por Victor Yarema.
  • Victor Yarema, nu știu la ce vă referiți prin „mod binar”. cmp este în mod inerent o comparație binară în opinia mea. Pe -b opțiune nu face decât să tipărească primul octet care este diferit. –  > Por H2ONaCl.
Daniel Alder

Pentru a găsi defecte în memoria flash, a trebuit să scriu acest script care arată toate blocurile de 1K care conțin diferențe (nu doar primul ca cmp -b o face)

#!/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
" $i "$r"
  fi
  i=$(expr $i + 1024)
done

Ieșire:

   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 $

Disclaimer: Am hackuit scriptul în 5 min. Nu suportă argumente în linia de comandă și nici spații în numele fișierelor

Comentarii

  • Primesc „r: not found” (folosind GNU linux) –  > Por unseen_rider.
  • @unseen_rider care shell, care linie? Vă rugăm să apelați scriptul folosind sh -x pentru depanare –  > Por Daniel Alder.
  • Acest lucru se face prin apelarea scriptului din terminal. Linia este 9. –  > Por unseen_rider.
  • @unseen_rider Nu te pot ajuta în acest fel. Scriptul este în regulă. Vă rugăm să postați ieșirea de depanare la pastebin.com. Puteți vedea aici ce vreau să spun: pastebin.com/8trgyF4A. De asemenea, vă rog să-mi spuneți și mie rezultatul de readlink -f $(which sh) –  > Por Daniel Alder.
  • Ultima comandă dă /bin/dash. În prezent creez paste pe pastebin. –  > Por unseen_rider.
DKroot

Diff cu următoarele opțiuni ar face o comparație binară pentru a verifica doar dacă fișierele sunt diferite și ar ieși dacă fișierele sunt la fel de bine:

diff -qs {file1} {file2}

Dacă comparați două fișiere cu același nume în directoare diferite, puteți folosi în schimb acest formular:

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

OS X El Capitan

StackzOfZtuff

Încercați diff -s

Răspuns scurt: rulați diff cu opțiunea -s comutator.

Răspuns lung: citiți mai jos.


Iată un exemplu. Să începem prin a crea două fișiere cu conținut binar aleatoriu:

$ 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

Acum să facem o copie a primului fișier:

$ cp test1.bin copyoftest1.bin

Acum test1.bin și test2.bin ar trebui să fie diferite:

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

… și test1.bin și copioftest1.bin ar trebui să fie identice:

$ diff test1.bin copyoftest1.bin

Dar așteptați! De ce nu există nici o ieșire?!?

Răspunsul este: acest lucru este proiectat. Nu există ieșire pentru fișiere identice.

Dar există coduri de eroare diferite:

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

$ echo $?
1


$ diff test1.bin copyoftest1.bin

$ echo $?
0

Din fericire, nu trebuie să verificați codurile de eroare de fiecare dată, pentru că puteți folosi pur și simplu funcția -s (sau --report-identical-files) pentru a face ca diff să fie mai verbos:

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

funnydman

Radiff2 este un instrument conceput pentru a compara fișiere binare, similar cu modul în care diff obișnuit compară fișiere text.

Încercați radiff2 care face parte din radare2 dezasamblorator. De exemplu, cu această comandă:

radiff2 -x file1.bin file2.bin

Veți obține o ieșire destul de formatată pe două coloane în care sunt evidențiate diferențele.

Michal Ambroz

Preferatele mele folosesc xxd hex-dumper din pachetul vim :

1) folosind vimdiff (parte din vim)

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

2) folosind diff

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

ashish
md5sum binary1 binary2

Dacă suma md5 este aceeași, binarele sunt aceleași

De ex.

md5sum new*
89c60189c3fa7ab5c96ae121ec43bd4a  new.txt
89c60189c3fa7ab5c96ae121ec43bd4a  new1.txt
[email protected]:~# cat new*
aa55 aa55 0000 8010 7738
aa55 aa55 0000 8010 7738


[email protected]:~# cat new*
aa55 aa55 000 8010 7738
aa55 aa55 0000 8010 7738
[email protected]:~# md5sum new*
4a7f86919d4ac00c6206e11fca462c6f  new.txt
89c60189c3fa7ab5c96ae121ec43bd4a  new1.txt

Comentarii

  • Nu chiar. Doar că posibilitatea este mare. –  > Por sawa.
  • Care este probabilitatea de a eșua ? –  > Por ashish.
  • Slabă, dar mai rea decât folosirea unei variante de diff, , față de care nu există niciun motiv pentru a o prefera. –  > Por sawa.
  • Ar trebui să schimbați hash-ul MD5 în SHA2 pentru ca acest sfat să fie practic. Laptopul oricui poate genera în aceste zile o coliziune în MD5 și pe baza acestui singur prefix de coliziune (2 fișiere de aceeași mărime, cu același prefix și același MD5) să genereze un număr infinit de fișiere care intră în coliziune (având același prefix, blocuri de coliziune diferite, același sufix) – -.  > Por Michal Ambroz.
Ahab Devoid

Există o modalitate relativ simplă de a verifica dacă două fișiere binare sunt identice.

Dacă folosiți intrarea/ieșirea fișierelor într-un limbaj de programare; puteți stoca fiecare bit al ambelor fișiere binare în propriile lor matrici.

În acest moment, verificarea este la fel de simplă ca :

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