Comment comparer des fichiers binaires pour vérifier s'ils sont identiques?

186

Quel est le moyen le plus simple (en utilisant un outil graphique ou une ligne de commande sur Ubuntu Linux) pour savoir si deux fichiers binaires sont identiques ou non (sauf pour les horodatages)? Je n'ai pas besoin d'extraire réellement la différence. J'ai juste besoin de savoir s'ils sont identiques ou non.

Sawa
la source
5
Une question demandant de montrer en quoi ils diffèrent: superuser.com/questions/125376/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
2
La page de manuel pour cmpdit spécifiquement qu'elle fait une comparaison octet par octet, c'est donc ma valeur par défaut pour 2 fichiers binaires. diffest ligne par ligne et vous donnera la même réponse Oui / Non mais bien sûr pas le même vidage vers le flux sortant standard. Si les lignes sont longues parce que ce ne sont peut-être pas des fichiers texte, je préférerais cmp. diffprésente l'avantage de pouvoir spécifier une comparaison de répertoires et la -rrécursivité pour comparer ainsi plusieurs fichiers en une seule commande.
H2ONaCl

Réponses:

180

Unix standard diffmontrera si les fichiers sont identiques ou non:

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

S'il n'y a pas de sortie de la commande, cela signifie que les fichiers n'ont pas de différences.

Joe
la source
5
diff semble avoir des problèmes avec des fichiers très volumineux . J'ai eu un diff: memory exhausteden comparant deux fichiers 13G.
Yongwei Wu
1
Sortie intéressante. diffvous dit que ce sont des fies "binaires". Puisque tous les fichiers peuvent être considérés comme binaires, c'est une affirmation étrange.
H2ONaCl
7
Vous pouvez signaler des fichiers identiques avec l'option: diff -s 1.bin 2.binou diff --report-identical-files 1.bin 2.binCela montreFiles 1.bin and 2.bin are identical
Tom Kuschel
1
Non, il dira qu'ils sont "différents", donc ils ne sont pas les mêmes
Josef Klimuk
1
J'ai deux exécutables, je sais qu'ils sont différents parce que je les ai compilés et exécutés, mais toutes les options de diff et cmp données ici les jugent identiques. Pourquoi? !!!
mirkastath
107

Utilisez la cmpcommande. Cela sortira proprement si elles sont égales en binaire, ou cela affichera où la première différence se produit et quittera.

bobjandal
la source
9
Pour le cas d'utilisation, l'OP décrit IMHO cmpest plus efficace que diff. Alors je préfère ça.
halloleo
5
J'ai un script shell qui s'exécute:cmp $1 $2 && echo "identical" || echo "different"
steveha
2
le cmp s'arrête-t-il quand il a trouvé la première différence et l'affiche-t-il ou il passe à la fin des fichiers?
sop
cmpa le mode "silencieux": -s, --quiet, --silent- suppress all normal output. Je n'ai pas encore testé mais je pense que ça s'arrêtera à la première différence s'il y en a une.
Victor Yarema
90

J'ai trouvé que Visual Binary Diff était ce que je recherchais, disponible sur:

  • 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
la source
1
Bien ... Je / pensais / je voulais seulement savoir si les fichiers différaient; mais être capable de voir facilement les différences exactes était beaucoup plus utile. Il avait tendance à segfault lorsque j'arrivais à la fin du fichier, mais tant pis, cela fonctionnait toujours.
Jeremy
2
Cela a été dit à quelques reprises, mais c'est un super petit programme! (pour info aussi sur homebrew)
johncip
2
Cela devrait être la réponse acceptée car c'est une méthode bien supérieure à la sortie fade et inutile de la commande diff canonique.
Gearoid Murphy
1
C'est le meilleur outil pour les différences binaires.
Carla Camargo
17

Utilisez sha1 pour générer la somme de contrôle:

sha1 [FILENAME1]
sha1 [FILENAME2]
Scott Presnell
la source
3
Si vous n'aviez une somme de contrôle que pour l'un des fichiers, cela serait utile, mais si vous avez les deux fichiers sur le disque, ce n'est pas nécessaire. diffet cmpvous diront tous les deux s'ils diffèrent sans effort supplémentaire.
johncip
1
N'est-ce pas à la sha1sumplace de sha1?
kol le
2
sha1 sur NetBSD, sha1sum sur Linux
Scott Presnell
2
Il y a deux fichiers qui renverront le même résultat bien qu'ils soient différents: shattered.io
mik
2
SHA1 a déjà une collision publique ( shattered.io ) et probablement quelques non-publiques également. Une collision peut être utilisée pour générer d'innombrables fichiers en collision. Utilisez plutôt SHA2 pour le hachage.
Michal Ambroz
12

J'ai fini par utiliser hexdump pour convertir les fichiers binaires en une représentation hexadécimale, puis je les ai ouverts dans meld / kompare / tout autre outil de diff. Contrairement à vous, j'étais après les différences dans les fichiers.

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

meld tmp/hex1.txt tmp/hex2.txt
Simotek
la source
1
À utiliser hexdump -v -e '/1 "%02x\n"'si vous souhaitez effectuer des différences et voir exactement quels octets ont été insérés ou supprimés.
William Entriken
Meld fonctionne également avec les fichiers binaires lorsqu'ils ne sont pas d'abord convertis en hexadécimal. Il affiche les valeurs hexadécimales pour les éléments qui ne sont pas dans le jeu de caractères, sinon les caractères normaux, ce qui est utile avec les fichiers binaires contenant également du texte ascii. Beaucoup le font, au moins commencent par une corde magique.
Felix Dombek
7

Vous pouvez utiliser la fonction de hachage MD5 pour vérifier si deux fichiers sont identiques, avec cela vous ne pouvez pas voir les différences à un bas niveau, mais c'est un moyen rapide de comparer deux fichiers.

md5 <filename1>
md5 <filename2>

Si les deux hachages MD5 (la sortie de la commande) sont identiques, les deux fichiers ne sont pas différents.

Rikki
la source
7
Pouvez-vous expliquer vos votes négatifs s'il vous plaît? SHA1 a 4 votes positifs, et si l'OP pense qu'il y a une chance que les deux fichiers soient identiques ou similaires, les chances d'une collision sont faibles et ne méritent pas de voter contre MD5 mais de voter SHA1 autrement que parce que vous avez entendu que vous devriez hacher votre mots de passe avec SHA1 au lieu de MD5 (c'est un problème différent).
Rikki
2
pas sûr de la raison, mais un cmp pur sera plus efficace que de calculer une fonction de hachage de fichiers et de les comparer (au moins pour seulement 2 fichiers)
Paweł Szczur
1
si les deux fichiers sont volumineux et sur le même disque (pas ssd), la variante md5 ou sha * pourrait être plus rapide car les disques peuvent lire les deux fichiers séquentiellement, ce qui économise beaucoup de mouvements de tête
Daniel Alder
7
J'ai voté contre parce que vous avez publié une variante mineure d'une (mauvaise) solution antérieure, alors que cela aurait dû être un commentaire.
johncip
6

Utilisez la commande cmp. Référez-vous aux fichiers binaires et forcer les comparaisons de texte pour plus d'informations.

cmp -b file1 file2
user2008151314
la source
1
-bne compare pas les fichiers en "mode binaire". En fait, "Avec GNU cmp, vous pouvez également utiliser l' option -bou --print-bytespour afficher la représentation ASCII de ces octets.". C'est exactement ce que j'ai trouvé en utilisant l'URL vers le manuel que vous avez fourni.
Victor Yarema
Victor Yarema, je ne sais pas ce que vous entendez par "mode binaire". cmpest intrinsèquement une comparaison binaire à mon avis. L' -boption imprime simplement le premier octet différent.
H2ONaCl
4

Pour trouver des défauts de mémoire flash, j'ai dû écrire ce script qui montre tous les blocs de 1K qui contiennent des différences (pas seulement le premier comme le cmp -bfait)

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

Production:

   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 $

Avertissement: j'ai piraté le script en 5 min. Il ne prend pas en charge les arguments de ligne de commande ni les espaces dans les noms de fichiers

Daniel Alder
la source
J'obtiens
@unseen_rider quel shell, quelle ligne? Veuillez appeler le script en utilisant sh -xpour le débogage
Daniel Alder
C'est en appelant le script depuis le terminal. La ligne est 9.
unseen_rider
@unseen_rider Je ne peux pas vous aider de cette façon. Le script est ok. Veuillez publier votre sortie de débogage sur pastebin.com . Vous pouvez voir ici ce que je veux dire: pastebin.com/8trgyF4A . Aussi, s'il vous plaît dites-moi la sortie dereadlink -f $(which sh)
Daniel Alder
La dernière commande donne /bin/dash. En cours de création de coller sur pastebin.
unseen_rider
4

Une différence avec les options suivantes ferait une comparaison binaire pour vérifier simplement si les fichiers sont différents du tout et cela afficherait si les fichiers sont également identiques:

diff -qs {file1} {file2}

Si vous comparez deux fichiers portant le même nom dans des répertoires différents, vous pouvez utiliser ce formulaire à la place:

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

OS X El Capitan

DKroot
la source
3

Essayez diff -s

Réponse courte: exécutez diffavec le -scommutateur.

Réponse longue: lisez ci-dessous.


Voici un exemple. Commençons par créer deux fichiers avec un contenu binaire aléatoire:

$ 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

Maintenant, faisons une copie du premier fichier:

$ cp test1.bin copyoftest1.bin

Maintenant, test1.bin et test2.bin devraient être différents:

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

... et test1.bin et copyoftest1.bin doivent être identiques:

$ diff test1.bin copyoftest1.bin

Mais attendez! Pourquoi n'y a-t-il pas de sortie?!?

La réponse est: c'est par conception. Il n'y a pas de sortie sur des fichiers identiques.

Mais il existe différents codes d'erreur:

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

$ echo $?
1


$ diff test1.bin copyoftest1.bin

$ echo $?
0

Maintenant, heureusement, vous n'avez pas à vérifier les codes d'erreur à chaque fois, car vous pouvez simplement utiliser le commutateur -s(ou --report-identical-files) pour rendre diff plus détaillé:

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

Radiff2 est un outil conçu pour comparer des fichiers binaires, de la même manière que diff compare les fichiers texte.

Essayez radiff2ce qui fait partie du radare2désassembleur. Par exemple, avec cette commande:

radiff2 -x file1.bin file2.bin

Vous obtenez une sortie de deux colonnes assez formatée où les différences sont mises en évidence.

funnydman
la source
1

Mes préférés utilisant xxd hex-dumper du package vim:

1) Utilisation de vimdiff (partie de vim)

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

2) en utilisant diff

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

Si la somme md5 est la même, les binaires sont identiques

Par exemple

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
cendré
la source
1
Pas assez. Seule la possibilité est élevée.
sawa
Quelle est la probabilité d'échec?
ashish
Mince, mais pire que d'utiliser une variante de diff, sur laquelle il n'y a aucune raison de la préférer.
sawa
Vous devrez changer le hachage MD5 en SHA2 pour que ce conseil soit pratique. L'ordinateur portable de n'importe qui peut de nos jours générer une collision dans MD5 et sur la base de ce préfixe de collision unique (2 fichiers de même taille, même préfixe et même MD5) pour générer un nombre infini de fichiers en collision (ayant le même préfixe, un bloc de collision différent, le même suffixe)
Michal Ambroz
-1

Il existe un moyen relativement simple de vérifier si deux fichiers binaires sont identiques.

Si vous utilisez des entrées / sorties de fichiers dans un langage de programmation; vous pouvez stocker chaque bit des deux fichiers binaires dans leurs propres tableaux.

À ce stade, la vérification est aussi simple que:

if(file1 != file2){
    //do this
}else{
    /do that
}
Ahab dépourvu
la source