Wie vergleiche ich Binärdateien, um zu überprüfen, ob sie gleich sind?

186

Was ist der einfachste Weg (mithilfe eines grafischen Tools oder einer Befehlszeile unter Ubuntu Linux) festzustellen, ob zwei Binärdateien gleich sind oder nicht (mit Ausnahme der Zeitstempel)? Ich muss den Unterschied nicht wirklich extrahieren. Ich muss nur wissen, ob sie gleich sind oder nicht.

sawa
quelle
5
Eine Frage, die zeigen soll, wie sie sich unterscheiden: superuser.com/questions/125376/…
Ciro Santilli 4 冠状 病 六四 事件 4
2
Die Manpage für cmpsagt ausdrücklich, dass es einen Byte-für-Byte-Vergleich durchführt, so dass dies meine Standardeinstellung für 2 Binärdateien ist. diffist Zeile für Zeile und gibt Ihnen die gleiche Ja / Nein-Antwort, aber natürlich nicht den gleichen Speicherauszug für den Standard-Out-Stream. Wenn die Zeilen lang sind, weil es sich vielleicht nicht um Textdateien handelt, würde ich es vorziehen cmp. diffhat den Vorteil, dass Sie einen Vergleich von Verzeichnissen und die -rfür die Rekursion angeben können, wodurch mehrere Dateien in einem Befehl verglichen werden.
H2ONaCl

Antworten:

180

Das Standard-Unix diffzeigt an, ob die Dateien identisch sind oder nicht:

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

Wenn der Befehl keine Ausgabe enthält, bedeutet dies, dass die Dateien keine Unterschiede aufweisen.

Joe
quelle
5
diff scheint Probleme mit wirklich großen Dateien zu haben. Ich habe diff: memory exhaustedbeim Vergleich zweier 13G-Dateien eine bekommen.
Yongwei Wu
1
Interessante Ausgabe. diffsagt dir, dass sie "binäre" Fies sind. Da alle Dateien als binär betrachtet werden können, ist dies eine seltsame Behauptung.
H2ONaCl
6
Sie können identische Dateien mit der Option melden: diff -s 1.bin 2.binoder diff --report-identical-files 1.bin 2.binDies zeigtFiles 1.bin and 2.bin are identical
Tom Kuschel
1
Nein, es wird sagen, dass sie "unterschiedlich" sind, also sind sie nicht gleich
Josef Klimuk
1
Ich habe zwei ausführbare Dateien, ich weiß, dass sie unterschiedlich sind, weil ich sie kompiliert und ausgeführt habe, aber alle hier angegebenen Optionen von diff und cmp beurteilen sie als identisch. Warum? !!!
Mirkastath
106

Verwenden cmpBefehl. Dies wird entweder sauber beendet, wenn sie binär gleich sind, oder es wird ausgedruckt, wo der erste Unterschied auftritt, und beendet.

Bobjandal
quelle
9
Für den Anwendungsfall beschreibt das OP IMHO cmpeffizienter als diff. Also würde ich das vorziehen.
Halloleo
5
Ich habe ein Shell-Skript, das ausgeführt wird:cmp $1 $2 && echo "identical" || echo "different"
steveha
2
stoppt der cmp, wenn er den ersten Unterschied gefunden hat, und zeigt ihn an oder durchläuft er das Ende der Dateien?
Sop
cmphat "stillen" Modus: -s, --quiet, --silent- suppress all normal output. Ich habe noch nicht getestet, aber ich denke, dass es beim ersten Unterschied aufhören wird, wenn es einen gibt.
Victor Yarema
89

Ich fand, dass Visual Binary Diff das war, wonach ich suchte, verfügbar auf:

  • Ubuntu:

    sudo apt install vbindiff
    
  • Arch Linux:

    sudo pacman -S vbindiff
    
  • Mac OS X über MacPorts :

    port install vbindiff
    
  • Mac OS X über Homebrew:

    brew install vbindiff
    
shao.lo
quelle
1
Schön ... ich / dachte / ich wollte nur wissen, ob die Dateien unterschiedlich sind; Es war jedoch viel nützlicher, die genauen Unterschiede leicht erkennen zu können. Als ich am Ende der Datei ankam, war es eher fehlerfrei, aber egal, es funktionierte immer noch.
Jeremy
2
Es wurde ein paar Mal gesagt, aber dies ist ein tolles kleines Programm! (Fyi auch auf Homebrew)
Johncip
2
Dies sollte die akzeptierte Antwort sein, da dies eine weit überlegene Methode ist als die langweilige und nicht hilfreiche Ausgabe des kanonischen Diff-Befehls.
Gearoid Murphy
1
Dies ist das beste Werkzeug für binäre Diff.
Carla Camargo
17

Verwenden Sie sha1, um eine Prüfsumme zu generieren:

sha1 [FILENAME1]
sha1 [FILENAME2]
Scott Presnell
quelle
3
Wenn Sie nur eine Prüfsumme für eine der Dateien hätten, wäre dies nützlich. Wenn Sie jedoch beide Dateien auf der Festplatte haben, ist dies nicht erforderlich. diffund cmpbeide werden Ihnen sagen, ob sie sich ohne zusätzlichen Aufwand unterscheiden.
Johncip
1
Ist es nicht sha1sumstatt sha1?
Kol
2
sha1 unter NetBSD, sha1sum unter Linux
Scott Presnell
2
Es gibt zwei Dateien, die das gleiche Ergebnis zurückgeben, obwohl sie unterschiedlich sind: shattered.io
mik
2
SHA1 hat bereits eine öffentliche Kollision ( shattered.io ) und wahrscheinlich auch eine nicht öffentliche. Eine Kollision kann verwendet werden, um unzählige kollidierende Dateien zu generieren. Verwenden Sie stattdessen SHA2 zum Hashing.
Michal Ambroz
12

Am Ende habe ich hexdump verwendet, um die Binärdateien in die hexadezimale Darstellung zu konvertieren, und sie dann in meld / kompare / einem anderen Diff-Tool geöffnet. Im Gegensatz zu dir war ich nach den Unterschieden in den Dateien.

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

meld tmp/hex1.txt tmp/hex2.txt
simotek
quelle
1
Verwenden hexdump -v -e '/1 "%02x\n"'Sie diese Option, wenn Sie unterscheiden und genau sehen möchten, welche Bytes eingefügt oder entfernt wurden.
William Entriken
Meld funktioniert auch mit Binärdateien, wenn diese nicht zuerst in Hex konvertiert werden. Es werden Hex-Werte für Dinge angezeigt, die nicht im Zeichensatz enthalten sind, ansonsten normale Zeichen, was bei Binärdateien nützlich ist, die auch ASCII-Text enthalten. Viele beginnen zumindest mit einer magischen Schnur.
Felix Dombek
7

Mit der MD5-Hash-Funktion können Sie überprüfen, ob zwei Dateien identisch sind. Auf diese Weise können Sie die Unterschiede auf niedriger Ebene nicht erkennen, aber Sie können schnell zwei Dateien vergleichen.

md5 <filename1>
md5 <filename2>

Wenn beide MD5-Hashes (die Befehlsausgabe) gleich sind, unterscheiden sich die beiden Dateien nicht.

Rikki
quelle
7
Können Sie bitte Ihre Abstimmungen erklären? SHA1 hat 4 positive Stimmen, und wenn das OP glaubt, dass die beiden Dateien gleich oder ähnlich sein könnten, ist die Wahrscheinlichkeit einer Kollision gering und es lohnt sich nicht, MD5 herunterzustimmen, aber SHA1 zu stimmen, außer weil Sie gehört haben, dass Sie Ihre hashen sollten Passwörter mit SHA1 anstelle von MD5 (das ist ein anderes Problem).
Rikki
2
Ich bin mir nicht sicher über den Grund, aber ein reiner CMP ist effizienter als die Berechnung einer Hash-Funktion von Dateien und deren Vergleich (zumindest für nur 2 Dateien)
Paweł Szczur
1
Wenn die beiden Dateien groß sind und sich auf derselben Festplatte befinden (nicht ssd), ist die Variante md5 oder sha * möglicherweise schneller, da die Festplatten die beiden Dateien nacheinander lesen können, was viele Kopfbewegungen erspart
Daniel Alder
7
Ich habe abgelehnt, weil Sie eine kleinere Variante einer früheren (schlechten) Lösung gepostet haben, wenn es ein Kommentar sein sollte.
Johncip
6

Verwenden Sie den Befehl cmp. Weitere Informationen finden Sie unter Binärdateien und Erzwingen von Textvergleichen .

cmp -b file1 file2
user2008151314
quelle
1
-bvergleicht keine Dateien im "Binärmodus". Es ist tatsächlich "Mit GNU cmpkönnen Sie auch die Option -boder verwenden --print-bytes, um die ASCII-Darstellung dieser Bytes anzuzeigen." Dies ist genau das, was ich mithilfe der von Ihnen angegebenen URL zum Handbuch gefunden habe.
Victor Yarema
Victor Yarema, ich weiß nicht, was Sie unter "Binärmodus" verstehen. cmpist meiner Meinung nach von Natur aus ein binärer Vergleich. Die -bOption druckt lediglich das erste Byte, das anders ist.
H2ONaCl
4

Um Flash-Speicherfehler zu finden, musste ich dieses Skript schreiben, das alle 1K-Blöcke anzeigt, die Unterschiede enthalten (nicht nur den ersten wie cmp -bauch)

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

Ausgabe:

   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 $

Haftungsausschluss: Ich habe das Skript in 5 Minuten gehackt. Es werden weder Befehlszeilenargumente noch Leerzeichen in Dateinamen unterstützt

Daniel Alder
quelle
Ich bekomme "r: nicht gefunden" (unter GNU Linux)
unseen_rider
@unseen_rider welche Shell, welche Zeile? Bitte rufen Sie das Skript mit sh -xzum Debuggen
Daniel Alder
Dies erfolgt über den Aufruf des Skripts vom Terminal aus. Linie ist 9.
unseen_rider
@unseen_rider Ich kann dir so nicht helfen. Das Skript ist in Ordnung. Bitte senden Sie Ihre Debug-Ausgabe an pastebin.com . Sie können hier sehen, was ich meine: pastebin.com/8trgyF4A . Bitte teilen Sie mir auch die Ausgabe vonreadlink -f $(which sh)
Daniel Alder
Der letzte Befehl gibt /bin/dash. Derzeit wird Paste auf Pastebin erstellt.
unseen_rider
4

Diff mit den folgenden Optionen würde einen binären Vergleich durchführen, um zu überprüfen, ob die Dateien überhaupt unterschiedlich sind, und es würde ausgegeben, wenn die Dateien auch gleich sind:

diff -qs {file1} {file2}

Wenn Sie zwei Dateien mit demselben Namen in verschiedenen Verzeichnissen vergleichen, können Sie stattdessen dieses Formular verwenden:

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

OS X El Capitan

DKroot
quelle
3

Versuchen Sie es mit diff -s

Kurze Antwort: diffMit dem -sSchalter laufen .

Lange Antwort: Lesen Sie weiter unten.


Hier ist ein Beispiel. Beginnen wir mit der Erstellung von zwei Dateien mit zufälligen binären Inhalten:

$ 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

Lassen Sie uns nun eine Kopie der ersten Datei erstellen:

$ cp test1.bin copyoftest1.bin

Jetzt sollten test1.bin und test2.bin unterschiedlich sein:

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

... und test1.bin und copyoftest1.bin sollten identisch sein:

$ diff test1.bin copyoftest1.bin

Aber warte! Warum gibt es keine Ausgabe?!?

Die Antwort lautet: Dies ist beabsichtigt. Es erfolgt keine Ausgabe für identische Dateien.

Es gibt jedoch verschiedene Fehlercodes:

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

$ echo $?
1


$ diff test1.bin copyoftest1.bin

$ echo $?
0

Glücklicherweise müssen Sie die Fehlercodes nicht jedes Mal überprüfen, da Sie einfach den Schalter -s(oder --report-identical-files) verwenden können , um diff ausführlicher zu machen:

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

Radiff2 ist ein Tool zum Vergleichen von Binärdateien, ähnlich wie reguläres Diff Textdateien vergleicht.

Versuchen Sie, radiff2was ein Teil von radare2Disassembler ist. Zum Beispiel mit diesem Befehl:

radiff2 -x file1.bin file2.bin

Sie erhalten eine hübsch formatierte Ausgabe mit zwei Spalten, in der Unterschiede hervorgehoben werden.

Funnydman
quelle
1

Meine Favoriten mit xxd Hex-Dumper aus dem vim-Paket:

1) Verwenden von vimdiff (Teil von vim)

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

2) mit diff

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

Wenn die md5sum identisch ist, sind die Binärdateien identisch

Z.B

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
aschfahl
quelle
1
Nicht ganz. Nur die Möglichkeit ist hoch.
Sawa
Wie hoch ist die Wahrscheinlichkeit eines Ausfalls?
Ashish
Schlank, aber schlimmer als die Verwendung einer Variante diff, für die es keinen Grund gibt, sie vorzuziehen.
Sawa
Sie müssten den MD5-Hash in SHA2 ändern, damit dieser Rat praktisch ist. Jeder Laptop kann heutzutage eine Kollision in MD5 erzeugen und basierend auf diesem einzelnen Kollisionspräfix (2 Dateien gleicher Größe, gleichem Präfix und gleichem MD5) unendlich viele kollidierende Dateien erzeugen (mit demselben Präfix, unterschiedlichem Kollisionsblock, gleichem Suffix)
Michal Ambroz
-1

Es gibt eine relativ einfache Möglichkeit, zu überprüfen, ob zwei Binärdateien identisch sind.

Wenn Sie die Dateieingabe / -ausgabe in einer Programmiersprache verwenden; Sie können jedes Bit der beiden Binärdateien in ihren eigenen Arrays speichern.

Zu diesem Zeitpunkt ist die Überprüfung so einfach wie:

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