[file] Как сравнить двоичные файлы, чтобы проверить, совпадают ли они?


Answers

Используйте команду cmp . Это приведет либо к чистому выходу, если они двоичные, либо распечатает, где происходит первое различие и выход.

Question

Самый простой способ (с помощью графического инструмента или командной строки на Ubuntu Linux) знать, являются ли два двоичных файла одинаковыми или нет (кроме временных меток)? Мне не нужно действительно извлекать разницу. Мне просто нужно знать, одинаковы они или нет.




Для обнаружения дефектов флэш-памяти мне пришлось написать этот скрипт, который показывает все блоки 1K, которые содержат различия (а не только первый, как 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

Вывод:

   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 $

Отказ от ответственности: я взломал скрипт за 5 минут. Он не поддерживает аргументы командной строки и не поддерживает пробелы в именах файлов




Попробуйте diff -s

Короткий ответ: запустите diff с ключом -s .

Длинный ответ: читайте ниже.

Вот пример. Начнем с создания двух файлов со случайным двоичным содержимым:

$ 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

Теперь давайте сделаем копию первого файла:

$ cp test1.bin copyoftest1.bin

Теперь test1.bin и test2.bin должны быть разными:

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

... и test1.bin и copyoftest1.bin должны быть одинаковыми:

$ diff test1.bin copyoftest1.bin

Но ждать! Почему нет выхода?!?

Ответ: это по дизайну. На идентичных файлах нет выхода.

Но существуют разные коды ошибок:

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

$ echo $?
1


$ diff test1.bin copyoftest1.bin

$ echo $?
0

Теперь, к счастью, вам не нужно проверять коды ошибок каждый раз, потому что вы можете просто использовать переключатель -s (или --report-identical-files ), чтобы сделать diff более подробным:

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






Используйте sha1 для создания контрольной суммы:

sha1 [FILENAME1]
sha1 [FILENAME2]



Related