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

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

Ответ 1

Стандартный unix diff покажет, являются ли файлы одинаковыми или нет:

[[email protected] ~]$ diff 1.bin 2.bin
Binary files 1.bin and 2.bin differ

Если в команде нет выхода, это означает, что файлы не имеют отличий.

Ответ 2

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

Ответ 3

Я обнаружил, что Visual Binary Diff был тем, что я искал, доступным на:

  • Ubuntu:

    sudo apt install vbindiff
    
  • Arch Linux:

    sudo pacman -S vbindiff
    
  • Mac OS X через MacPorts:

    sudo port install vbindiff
    
  • Mac OS X через Homebrew:

    sudo brew install vbindiff
    

Ответ 4

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

sha1 [FILENAME1]
sha1 [FILENAME2]

Ответ 5

В итоге я использовал hexdump для преобразования двоичных файлов в шестнадцатеричное представление, а затем открыл их в meld/kompare/любом другом инструменте diff. В отличие от вас, я был после различий в файлах.

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

meld tmp/hex1.txt tmp/hex2.txt

Ответ 7

Вы можете использовать функцию хеширования MD5, чтобы проверить, совпадают ли два файла, при этом вы не сможете увидеть различия на низком уровне, но это быстрый способ сравнить два файла.

md5 <filename1>
md5 <filename2>

Если оба MD5-хэша (выходные данные команды) одинаковы, то эти два файла не отличаются.

Ответ 8

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

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

Ответ 9

Diff со следующими параметрами выполнил бы двоичное сравнение, чтобы проверить, просто ли файлы разные, и он будет выводиться, если файлы одинаковы:

diff -qs {file1} {file2}

Если вы сравниваете два файла с тем же именем в разных каталогах, вы можете использовать эту форму:

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

OS X El Capitan

Ответ 10

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

Краткий ответ: запустите diff с -s переключателя -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

Ответ 11

Radiff2 - это инструмент, разработанный для сравнения двоичных файлов, аналогично тому, как обычный diff сравнивает текстовые файлы.

Попробуйте radiff2 который является частью дизассемблера radare2. Например, с помощью этой команды:

radiff2 -x file1.bin file2.bin

Вы получаете довольно отформатированный вывод двух столбцов, где различия выделены.

Ответ 12

md5sum binary1 binary2

Если сумма md5 одинакова, двоичные файлы совпадают

Например

md5sum new*
89c60189c3fa7ab5c96ae121ec43bd4a  new.txt
89c60189c3fa7ab5c96ae121ec43bd4a  new1.txt
[email protected]:~# cat new*
aa55 aa55 0000 8010 7738
aa55 aa55 0000 8010 7738


[email protected]:~# cat new*
aa55 aa55 000 8010 7738
aa55 aa55 0000 8010 7738
[email protected]:~# md5sum new*
4a7f86919d4ac00c6206e11fca462c6f  new.txt
89c60189c3fa7ab5c96ae121ec43bd4a  new1.txt

Ответ 13

Мои любимые, использующие xxd hex-dumper из пакета vim:

1) используя vimdiff (часть vim)

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

2) используя diff

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

Ответ 14

Существует относительно простой способ проверить, совпадают ли два двоичных файла.

Если вы используете файл ввода/вывода на языке программирования; Вы можете хранить каждый бит обоих двоичных файлов в своих собственных массивах.

На этом этапе проверка так же проста, как:

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