web-dev-qa-db-fra.com

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

Quel est le moyen le plus simple (à l'aide d'un outil graphique ou d'une ligne de commande sous Ubuntu Linux) de savoir si deux fichiers binaires sont identiques ou non (à l'exception des 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.

151
sawa

Le unix standard diff indiquera 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 aucune différence.

149
Joe

Utilisez la commande cmp. Cela permet de sortir proprement s'ils sont égaux en binaire ou d'indiquer l'endroit où la première différence se produit et de sortir.

90
bobjandal

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

  • Ubuntu: apt-get install vbindiff
  • Arch Linux: pacman -S vbindiff
  • Mac OS X: port install vbindiff via MacPorts .
  • Mac OS X: brew install vbindiff via Homebrew
78
shao.lo

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

sha1 [FILENAME1]
sha1 [FILENAME2]
16
Scott Presnell

J'ai fini par utiliser hexdump pour convertir les fichiers binaires en représentation hexadécimale puis les ouvrir 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
11
simotek

Utilisez la commande cmp. Reportez-vous à Comparaison de fichiers binaires et de texte forcé pour plus d'informations.

cmp -b file1 file2
6
user2008151314

md5 <filename1>

md5 <filename2>

Voyez si ce sont les mêmes :-)

5
Rikki

Diff avec les options suivantes ferait une comparaison binaire pour vérifier si les fichiers sont différents et pour afficher si les fichiers sont 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

4
DKroot

Pour trouver des défauts de mémoire flash, j'ai dû écrire ce script qui montre tous les blocs 1K qui contiennent des différences (pas seulement le premier, comme le fait 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

Sortie:

   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: 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.

4
Daniel Alder

Essayez diff -s

Réponse courte: exécutez diff avec le commutateur -s.

Réponse longue: lisez ci-dessous.


Voici un exemple. Commençons par créer deux fichiers avec des contenus binaires aléatoires:

$ 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

Faisons maintenant 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

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 que diff soit plus détaillé:

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

Radiff2 est un outil conçu pour comparer des fichiers binaires, similaire à la comparaison classique entre fichiers texte.

Essayez radiff2 qui fait partie du désassembleur radare2. Par exemple, avec cette commande:

radiff2 -x file1.bin file2.bin

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

2
FUNNYDMAN

Mes préférés avec xxd hex-dumper du paquet vim:

1) en utilisant vimdiff (une 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 '  \|  '
0
Michal Ambroz