Jak porównać pliki binarne, aby sprawdzić, czy są takie same?


186

Jaki jest najłatwiejszy sposób (za pomocą narzędzia graficznego lub wiersza poleceń w systemie Ubuntu Linux), aby dowiedzieć się, czy dwa pliki binarne są takie same, czy nie (z wyjątkiem znaczników czasu)? Nie muszę tak naprawdę wyodrębniać różnicy. Muszę tylko wiedzieć, czy są takie same, czy nie.



2
Strona man dla cmpkonkretnie mówi, że robi porównanie bajt po bajcie, więc jest to moja domyślna wartość dla 2 plików binarnych. diffjest linia po linii i da ci tę samą odpowiedź Tak / Nie, ale oczywiście nie ten sam zrzut do standardowego strumienia wyjściowego. Jeśli linie są długie, ponieważ być może nie są plikami tekstowymi, wolałbym cmp. diffma tę zaletę, że można określić porównanie katalogów i -rrekurencję, porównując w ten sposób wiele plików w jednym poleceniu.
H2ONaCl

Odpowiedzi:


180

Standardowy unix diffpokaże, czy pliki są takie same, czy nie:

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

Jeśli nie ma danych wyjściowych polecenia, oznacza to, że pliki nie mają różnic.


5
diff wydaje się mieć problemy z naprawdę dużymi plikami. Mam problem z diff: memory exhaustedporównywaniem dwóch plików 13G.
Yongwei Wu,

1
Ciekawa produkcja. diffmówi wam, że to „binarne” fies. Ponieważ wszystkie pliki można uznać za binarne, jest to dziwne stwierdzenie.
H2ONaCl

7
Możesz zgłosić identyczne pliki z opcją: diff -s 1.bin 2.binlub diff --report-identical-files 1.bin 2.binTo pokazujeFiles 1.bin and 2.bin are identical
Tom Kuschel

1
Nie, powiedzą, że są „różni”, więc nie są tacy sami
Josef Klimuk

1
Mam dwa pliki wykonywalne, wiem, że są różne, ponieważ je skompilowałem i uruchomiłem, ale wszystkie podane tutaj opcje diff i cmp oceniają je identycznie. Czemu? !!!
mirkastath

107

Użyj cmppolecenia. To wyjdzie czysto, jeśli są binarne, lub wydrukuje miejsce wystąpienia pierwszej różnicy i zakończy działanie.


9
W przypadku użycia OP opisuje, że IMHO cmpjest bardziej wydajny niż diff. Wolałbym to.
halloleo

5
Mam skrypt powłoki, który działa:cmp $1 $2 && echo "identical" || echo "different"
steveha

2
czy cmp zatrzymuje się, gdy znajdzie pierwszą różnicę, i wyświetla ją, czy też przechodzi przez koniec plików?
sop

cmpma tryb „cichy”: -s, --quiet, --silent- suppress all normal output. Nie testowałem jeszcze, ale myślę, że zatrzyma się na pierwszej różnicy, jeśli taka istnieje.
Victor Yarema

89

Odkryłem, że Visual Binary Diff był tym, czego szukałem, dostępny na:

  • Ubuntu:

    sudo apt install vbindiff
    
  • Arch Linux:

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

    port install vbindiff
    
  • Mac OS X przez Homebrew:

    brew install vbindiff
    

1
Fajnie ... pomyślałem / chciałem tylko wiedzieć, czy pliki się różnią; ale możliwość łatwego dostrzeżenia dokładnych różnic była o wiele bardziej przydatna. Kiedy dotarłem do końca pliku, miało to tendencję do segregacji, ale nieważne, nadal działało.
Jeremy

2
To zostało powiedziane kilka razy, ale to świetny mały program! (fyi również w homebrew)
John

2
To powinna być zaakceptowana odpowiedź, ponieważ jest to znacznie lepsza metoda niż nijakie i niepomocne wyjście z kanonicznego polecenia diff.
Gearoid Murphy

1
Jest to najlepsze narzędzie do różnic binarnych.
Carla Camargo

17

Użyj sha1, aby wygenerować sumę kontrolną:

sha1 [FILENAME1]
sha1 [FILENAME2]

3
Gdybyś miał tylko sumę kontrolną dla jednego z plików, byłoby to przydatne, ale jeśli masz oba pliki na dysku, nie jest to konieczne. diffi cmpobaj powiedzą ci, czy różnią się bez żadnego dodatkowego wysiłku.
johncip

1
Czy to nie jest sha1sumzamiast sha1?
kol

2
sha1 na NetBSD, sha1sum na Linux
Scott Presnell

2
Istnieją dwa pliki, które zwrócą ten sam wynik, mimo że są różne: shattered.io
mik

2
SHA1 ma już jedną publiczną kolizję ( shattered.io ) i prawdopodobnie również niepubliczną. Jedna kolizja może być użyta do wygenerowania niezliczonej ilości kolidujących plików. Zamiast tego użyj SHA2 do mieszania.
Michał Ambroz

12

Skończyło się na użyciu hexdump do konwersji plików binarnych do reprezentacji szesnastkowej, a następnie otworzyłem je w meld / kompare / dowolnym innym narzędziu różnicowym. W przeciwieństwie do ciebie, szukałem różnic w plikach.

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

meld tmp/hex1.txt tmp/hex2.txt

1
Użyj, hexdump -v -e '/1 "%02x\n"'jeśli chcesz się różnić i zobaczyć, które bajty zostały wstawione lub usunięte.
William Entriken,

Meld działa również z plikami binarnymi, gdy nie są one najpierw konwertowane na hex. Pokazuje wartości szesnastkowe dla rzeczy, których nie ma w zestawie znaków, w przeciwnym razie normalne znaki, co jest przydatne w plikach binarnych zawierających również tekst ascii. Wielu tak przynajmniej zaczyna się od magicznego sznurka.
Felix Dombek

7

Możesz użyć funkcji skrótu MD5, aby sprawdzić, czy dwa pliki są takie same, dzięki czemu nie widać różnic na niskim poziomie, ale jest to szybki sposób na porównanie dwóch plików.

md5 <filename1>
md5 <filename2>

Jeśli oba skróty MD5 (dane wyjściowe polecenia) są takie same, oba pliki nie są różne.


7
Czy możesz wyjaśnić swoje głosy negatywne? SHA1 ma 4 głosy poparcia, a jeśli OP uważa, że ​​istnieje szansa, że ​​dwa pliki mogą być takie same lub podobne, szanse na kolizję są niewielkie i nie są warte głosowania w dół MD5, ale głosowania w górę SHA1 inaczej niż dlatego, że słyszałeś, że powinieneś haszować swój hasła z SHA1 zamiast MD5 (to inny problem).
Rikki

2
nie jestem pewien przyczyny, ale czysty cmp będzie bardziej wydajny niż obliczanie dowolnej funkcji skrótu plików i porównywanie ich (przynajmniej dla tylko 2 plików)
Paweł Szczur

1
jeśli dwa pliki są duże i znajdują się na tym samym dysku (nie ssd), wariant md5 lub sha * może być szybszy, ponieważ dyski mogą odczytywać dwa pliki sekwencyjnie, co oszczędza dużo ruchów głową
Daniel Alder

7
Odrzuciłem głos, ponieważ opublikowałeś niewielki wariant wcześniejszego (złego) rozwiązania, kiedy powinien to być komentarz.
johncip

6

Użyj polecenia cmp. Aby uzyskać więcej informacji, zobacz Pliki binarne i wymuszanie porównań tekstowych .

cmp -b file1 file2

1
-bnie porównuje plików w „trybie binarnym”. W rzeczywistości „W GNU cmpmożesz także użyć opcji -blub --print-bytes, aby wyświetlić reprezentację ASCII tych bajtów.”. To jest dokładnie to, co znalazłem przy użyciu adresu URL do instrukcji, którą podałeś.
Victor Yarema,

Victor Yarema, nie wiem, co rozumiesz przez „tryb binarny”. cmpjest z natury moim zdaniem porównaniem binarnym. -bOpcja drukuje tylko pierwszy bajt, że jest inaczej.
H2ONaCl

4

Aby znaleźć defekty pamięci flash, musiałem napisać ten skrypt, który pokazuje wszystkie bloki 1K zawierające różnice (nie tylko pierwszy blok jak 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

Wynik:

   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 $

Uwaga: zhakowałem skrypt w 5 minut. Nie obsługuje argumentów wiersza poleceń ani nie obsługuje spacji w nazwach plików


Dostaję „r: not found” (używając GNU linux)
unseen_rider

@unseen_rider która powłoka, która linia? Zadzwoń do skryptu przy użyciu sh -xdo debugowania
Daniel Alder

Odbywa się to poprzez wywołanie skryptu z terminala. Linia jest 9.
unseen_rider

@unseen_rider Nie mogę ci pomóc w ten sposób. Skrypt jest w porządku. Prześlij wyniki debugowania na pastebin.com . Możesz zobaczyć tutaj, co mam na myśli: pastebin.com/8trgyF4A . Opowiedz mi także o readlink -f $(which sh)
wynikach

Ostatnie polecenie daje /bin/dash . Obecnie tworzy wklej na pastebin.
unseen_rider

4

Zróżnicuj za pomocą następujących opcji wykonałby porównanie binarne, aby sprawdzić, czy pliki w ogóle są różne, i wyświetliłby się, jeśli pliki są takie same:

diff -qs {file1} {file2}

Jeśli porównujesz dwa pliki o tej samej nazwie w różnych katalogach, możesz zamiast tego użyć tego formularza:

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

OS X El Capitan


3

Wypróbuj diff -s

Krótka odpowiedź: uruchom diffz-s przełącznikiem.

Długa odpowiedź: czytaj dalej.


Oto przykład. Zacznijmy od utworzenia dwóch plików z losową zawartością binarną:

$ 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

Teraz zróbmy kopię pierwszego pliku:

$ cp test1.bin copyoftest1.bin

Teraz test1.bin i test2.bin powinny być różne:

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

... oraz test1.bin i copyoftest1.bin powinny być identyczne:

$ diff test1.bin copyoftest1.bin

Ale poczekaj! Dlaczego nie ma wyjścia?!?

Odpowiedź brzmi: jest to zgodne z projektem. Brak danych wyjściowych dla identycznych plików.

Ale są różne kody błędów:

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

$ echo $?
1


$ diff test1.bin copyoftest1.bin

$ echo $?
0

Na szczęście nie musisz za każdym razem sprawdzać kodów błędów, ponieważ możesz po prostu użyć przełącznika -s(lub --report-identical-files), aby diff był bardziej szczegółowy:

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

2

Radiff2 to narzędzie zaprojektowane do porównywania plików binarnych, podobnie jak zwykły diff porównuje pliki tekstowe.

Spróbuj, radiff2który jest częścią radare2deasemblera. Na przykład za pomocą tego polecenia:

radiff2 -x file1.bin file2.bin

Otrzymasz dość sformatowane wyjście dwóch kolumn, w których różnice są podświetlone.


1

Moje ulubione używające xxd hex-dumper z pakietu vim:

1) przy użyciu vimdiff (część vim)

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

2) używając diff

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

0
md5sum binary1 binary2

Jeśli suma md5 jest taka sama, pliki binarne są takie same

Na przykład

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

1
Nie do końca. Tylko możliwość jest wysoka.
sawa,

Jakie jest prawdopodobieństwo niepowodzenia?
ashish

Smukły, ale gorszy niż użycie jakiegoś wariantu diff, nad którym nie ma powodu, aby go preferować.
sawa,

Musisz zmienić skrót MD5 na SHA2, aby ta porada była praktyczna. Każdy laptop może obecnie generować kolizję w MD5 i na podstawie tego pojedynczego prefiksu kolizji (2 pliki tego samego rozmiaru, tego samego prefiksu i tego samego MD5) w celu wygenerowania nieskończonej liczby kolidujących plików (mających ten sam prefiks, inny blok kolizyjny, ten sam sufiks)
Michał Ambroz

-1

Istnieje stosunkowo prosty sposób sprawdzenia, czy dwa pliki binarne są takie same.

Jeśli korzystasz z wejścia / wyjścia pliku w języku programowania; możesz przechowywać każdy bit obu plików binarnych we własnych tablicach.

W tym momencie kontrola jest tak prosta, jak:

if(file1 != file2){
    //do this
}else{
    /do that
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.