Làm thế nào để so sánh các tệp nhị phân để kiểm tra nếu chúng giống nhau?


186

Cách dễ nhất (sử dụng công cụ đồ họa hoặc dòng lệnh trên Ubuntu Linux) để biết liệu hai tệp nhị phân có giống nhau hay không (ngoại trừ dấu thời gian)? Tôi không cần phải thực sự trích xuất sự khác biệt. Tôi chỉ cần biết liệu chúng có giống nhau hay không.


5
Một câu hỏi yêu cầu cho thấy chúng khác nhau như thế nào : superuser.com/questions/125376/
Kẻ

2
Trang hướng dẫn cmpcụ thể cho biết nó thực hiện so sánh byte theo byte để đó là mặc định của tôi cho 2 tệp nhị phân. difflà từng dòng một và sẽ cung cấp cho bạn cùng một câu trả lời Có / Không nhưng tất nhiên không phải là kết xuất tương tự với luồng ra tiêu chuẩn. Nếu các dòng dài vì có lẽ chúng không phải là tệp văn bản thì tôi thích cmp. diffcó lợi thế là bạn có thể chỉ định so sánh các thư mục và -rđệ quy do đó so sánh nhiều tệp trong một lệnh.
H2ONaCl

Câu trả lời:


180

Unix tiêu chuẩn diffsẽ hiển thị nếu các tệp giống nhau hay không:

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

Nếu không có đầu ra từ lệnh, điều đó có nghĩa là các tệp không có sự khác biệt.


5
diff dường như có vấn đề với các tập tin thực sự lớn . Tôi đã nhận được diff: memory exhaustedkhi so sánh hai tập tin 13G.
Yongwei Wu

1
Sản lượng thú vị. diffđang nói với bạn rằng họ là những kẻ thù "nhị phân". Vì tất cả các tệp có thể được coi là nhị phân đó là một khẳng định kỳ lạ.
H2ONaCl

6
Bạn có thể báo cáo các tệp giống hệt nhau với tùy chọn: diff -s 1.bin 2.binhoặc diff --report-identical-files 1.bin 2.binChương trình nàyFiles 1.bin and 2.bin are identical
Tom Kuschel

1
Không, nó sẽ nói rằng chúng "khác biệt", vì vậy chúng không giống nhau
Josef Klimuk 20/03/18

1
Tôi có hai tệp thực thi, tôi biết chúng khác nhau vì tôi đã biên dịch và chạy chúng, nhưng tất cả các tùy chọn khác biệt và cmp được đưa ra ở đây đánh giá chúng giống hệt nhau. Tại sao? !!!
mirkastath

106

Sử dụng cmplệnh. Điều này sẽ thoát một cách sạch sẽ nếu chúng là nhị phân bằng nhau, hoặc nó sẽ in ra nơi khác biệt đầu tiên xảy ra và thoát.


9
Đối với trường hợp sử dụng, OP mô tả IMHO cmphiệu quả hơn diff. Vì vậy, tôi thích điều này.
halloleo

5
Tôi có một kịch bản shell chạy:cmp $1 $2 && echo "identical" || echo "different"
steveha 14/12/14

2
cmp có dừng lại khi tìm thấy sự khác biệt đầu tiên và hiển thị nó hoặc nó đi qua phần cuối của các tệp không?
lau

cmpcó chế độ "im lặng": -s, --quiet, --silent- suppress all normal output. Tôi chưa thử nghiệm nhưng tôi nghĩ rằng nó sẽ dừng ở sự khác biệt đầu tiên nếu có.
Victor Yarema

89

Tôi tìm thấy Visual Binary Diff là thứ tôi đang tìm kiếm, có sẵn trên:

  • Ubuntu:

    sudo apt install vbindiff
    
  • Arch Linux:

    sudo pacman -S vbindiff
    
  • Mac OS X qua MacPorts :

    port install vbindiff
    
  • Mac OS X qua Homebrew:

    brew install vbindiff
    

1
Đẹp ... Tôi / nghĩ / Tôi chỉ muốn biết liệu các tập tin có khác nhau không; nhưng có thể thấy sự khác biệt chính xác một cách dễ dàng thì hữu ích hơn rất nhiều. Nó có xu hướng segfault khi tôi đến cuối tập tin, nhưng không sao, nó vẫn hoạt động.
Jeremy

2
Điều đó đã được nói một vài lần, nhưng đây là một chương trình nhỏ tuyệt vời! (fyi cũng trên homebrew)
johncip

2
Đây phải là câu trả lời được chấp nhận vì đây là một phương pháp vượt trội hơn nhiều so với đầu ra nhạt nhẽo và không có ích của lệnh diffical canonical.
Gearoid Murphy

1
Đây là công cụ tốt nhất cho diff nhị phân.
Carla Camargo

17

Sử dụng sha1 để tạo tổng kiểm tra:

sha1 [FILENAME1]
sha1 [FILENAME2]

3
Nếu bạn chỉ có một tổng kiểm tra cho một trong các tệp, điều này sẽ hữu ích, nhưng nếu bạn có cả hai tệp trên đĩa thì điều này là không cần thiết. diffcmpcả hai sẽ cho bạn biết nếu chúng khác nhau mà không cần nỗ lực thêm.
johncip

1
Không phải nó sha1sumthay vì sha1?
kol

2
sha1 trên NetBSD, sha1sum trên Linux
Scott Presnell

2
Có hai tệp sẽ trả về cùng một kết quả mặc dù khác nhau: shatter.io
mik

2
SHA1 đã có một vụ va chạm công khai ( shatter.io ) và có lẽ một số không công khai là tốt. Một va chạm có thể được sử dụng để tạo ra vô số tệp va chạm Sử dụng SHA2 để băm thay thế.
Michal Ambroz

12

Tôi đã kết thúc bằng cách sử dụng hexdump để chuyển đổi các tệp nhị phân thành biểu diễn hex và sau đó mở chúng trong meld / kompare / bất kỳ công cụ tìm khác. Không giống như bạn, tôi là sau sự khác biệt trong các tập tin.

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

meld tmp/hex1.txt tmp/hex2.txt

1
Sử dụng hexdump -v -e '/1 "%02x\n"'nếu bạn muốn tìm khác biệt và xem chính xác byte nào được chèn hoặc loại bỏ.
William Entriken

Meld cũng hoạt động với các tệp nhị phân khi chúng không được chuyển đổi thành hex trước. Nó hiển thị các giá trị hex cho những thứ không có trong tập char, nếu không thì các ký tự bình thường, rất hữu ích với các tệp nhị phân cũng chứa một số văn bản ascii. Nhiều người làm, ít nhất là bắt đầu với một chuỗi ma thuật.
Felix Dombek

7

Bạn có thể sử dụng hàm băm MD5 để kiểm tra xem hai tệp có giống nhau không, với điều này bạn không thể thấy sự khác biệt ở mức độ thấp, nhưng là một cách nhanh chóng để so sánh hai tệp.

md5 <filename1>
md5 <filename2>

Nếu cả hai giá trị băm MD5 (đầu ra lệnh) đều giống nhau, thì hai tệp không khác nhau.


7
Bạn có thể giải thích phiếu bầu của bạn xin vui lòng? SHA1 có 4 upvote và nếu OP nghĩ rằng có khả năng hai tệp có thể giống nhau hoặc tương tự nhau, thì khả năng xảy ra xung đột là rất nhỏ và không đáng để bỏ phiếu MD5 nhưng bỏ phiếu SHA1 khác vì bạn nghe thấy bạn nên băm mật khẩu với SHA1 thay vì MD5 (đó là một vấn đề khác).
Rikki

2
không chắc chắn về lý do nhưng một cmp thuần túy sẽ hiệu quả hơn so với việc tính toán bất kỳ hàm băm nào của các tệp và so sánh chúng (ít nhất là chỉ với 2 tệp)
Paweł Szczur

1
nếu hai tệp lớn và trên cùng một đĩa (không phải ssd), biến thể md5 hoặc sha * có thể nhanh hơn vì các đĩa có thể đọc hai tệp tuần tự giúp tiết kiệm rất nhiều chuyển động của đầu
Daniel Alder

7
Tôi đánh giá thấp bởi vì bạn đã đăng một biến thể nhỏ của một giải pháp (xấu) trước đó, khi nó đáng lẽ phải là một bình luận.
johncip

6

Sử dụng lệnh cmp. Tham khảo tệp nhị phân và buộc so sánh văn bản để biết thêm thông tin.

cmp -b file1 file2

1
-bkhông so sánh các tệp trong "chế độ nhị phân". Nó thực sự "Với GNU cmp, bạn cũng có thể sử dụng -bhoặc --print-bytestùy chọn để hiển thị biểu diễn ASCII của các byte đó." Đây chính xác là những gì tôi tìm thấy bằng cách sử dụng URL để hướng dẫn sử dụng mà bạn đã cung cấp.
Victor Yarema

Victor Yarema, tôi không biết ý của bạn là "chế độ nhị phân". cmptheo tôi là một so sánh nhị phân. Các -btùy chọn chỉ in các byte đầu tiên đó là khác nhau.
H2ONaCl

4

Để tìm lỗi bộ nhớ flash, tôi đã phải viết tập lệnh này hiển thị tất cả các khối 1K có chứa sự khác biệt (không chỉ khối đầu tiên như cmp -bvậy)

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

Đầu ra:

   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 $

Tuyên bố miễn trừ trách nhiệm: Tôi đã hack đoạn script sau 5 phút. Nó không hỗ trợ các đối số dòng lệnh và cũng không hỗ trợ khoảng trắng trong tên tệp


Tôi nhận được "r: không tìm thấy" (sử dụng GNU linux)
unseen_rider

@unseen_rider vỏ nào, dòng nào? Vui lòng gọi tập lệnh bằng cách sử dụng sh -xđể gỡ lỗi
Daniel Alder

Điều này là thông qua việc gọi các kịch bản từ thiết bị đầu cuối. Dòng là 9.
unseen_rider

@unseen_rider Tôi không thể giúp bạn theo cách này. Kịch bản là ok. Vui lòng gửi đầu ra gỡ lỗi của bạn lên pastebin.com . Bạn có thể thấy ở đây ý tôi là: pastebin.com/8trgyF4A . Ngoài ra, vui lòng cho tôi biết đầu ra củareadlink -f $(which sh)
Daniel Alder

Lệnh cuối cùng đưa ra /bin/dash. Hiện đang tạo dán trên pastebin.
unseen_rider

4

Khác với các tùy chọn sau sẽ thực hiện so sánh nhị phân để kiểm tra xem các tệp có khác nhau không và nó sẽ xuất ra nếu các tệp giống nhau:

diff -qs {file1} {file2}

Nếu bạn đang so sánh hai tệp có cùng tên trong các thư mục khác nhau, bạn có thể sử dụng biểu mẫu này thay thế:

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

Hệ điều hành El Capitan


3

Hãy thử diff -s

Câu trả lời ngắn: chạy diffvới-s tắc.

Câu trả lời dài: đọc bên dưới.


Đây là một ví dụ. Hãy bắt đầu bằng cách tạo hai tệp có nội dung nhị phân ngẫu nhiên:

$ 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

Bây giờ hãy tạo một bản sao của tệp đầu tiên:

$ cp test1.bin copyoftest1.bin

Bây giờ test1.bin và test2.bin phải khác nhau:

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

... và test1.bin và copyoftest1.bin phải giống hệt nhau:

$ diff test1.bin copyoftest1.bin

Nhưng chờ đã! Tại sao không có đầu ra?!?

Câu trả lời là: đây là do thiết kế. Không có đầu ra trên các tập tin giống hệt nhau.

Nhưng có các mã lỗi khác nhau:

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

$ echo $?
1


$ diff test1.bin copyoftest1.bin

$ echo $?
0

Bây giờ, may mắn thay, bạn không phải kiểm tra mã lỗi mỗi lần vì bạn chỉ có thể sử dụng công tắc -s(hoặc --report-identical-files) để làm cho khác biệt hơn:

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

2

Radiff2 là một công cụ được thiết kế để so sánh các tệp nhị phân, tương tự như cách so sánh các tệp văn bản thông thường.

Hãy thử radiff2đó là một phần của trình dịch ngược radare2. Chẳng hạn, với lệnh này:

radiff2 -x file1.bin file2.bin

Bạn nhận được đầu ra hai cột được định dạng đẹp, trong đó sự khác biệt được tô sáng.


1

Những cái ưa thích của tôi sử dụng xxd hex-dumper từ gói vim:

1) sử dụng vimdiff (một phần của vim)

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

2) sử dụng khác

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

0
md5sum binary1 binary2

Nếu md5sum giống nhau, nhị phân giống nhau

Ví dụ

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

1
Không hẳn. Chỉ có khả năng là cao.
sawa

Xác suất thất bại là gì?
tro lên

Mỏng, nhưng tồi tệ hơn so với việc sử dụng một số biến thể của diff, mà không có lý do để thích nó.
sawa

Bạn sẽ phải thay đổi băm MD5 thành SHA2 để lời khuyên này trở nên thiết thực. Ngày nay, máy tính xách tay của bất kỳ ai cũng có thể tạo xung đột trong MD5 và dựa trên tiền tố va chạm đơn này (2 tệp có cùng kích thước, cùng tiền tố và cùng MD5) để tạo vô số tệp va chạm (có cùng tiền tố, khối va chạm khác nhau, cùng hậu tố)
Michal Ambroz

-1

Có một cách tương đối đơn giản để kiểm tra xem hai tệp nhị phân có giống nhau không.

Nếu bạn sử dụng đầu vào / đầu ra tệp trong ngôn ngữ lập trình; bạn có thể lưu trữ từng bit của cả hai tệp nhị phân vào mảng riêng của chúng.

Tại thời điểm này, việc kiểm tra rất đơn giản như:

if(file1 != file2){
    //do this
}else{
    /do that
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.