Câu hỏi Làm cách nào để so sánh các tệp nhị phân trong Linux?
Tôi cần so sánh hai tệp nhị phân và nhận được kết quả đầu ra trong biểu mẫu
<fileoffset-hex> <file1-byte-hex> <tệp2-byte-hex>
cho mỗi byte khác nhau. Do đó, nếu file1.bin
Là
00 90 00 11
ở dạng nhị phân và file2.bin
Là
00 91 00 10
Tôi muốn có một cái gì đó như
00000001 90 91
00000003 11 10
Cách dễ nhất để hoàn thành mục tiêu là gì? Công cụ chuẩn? Một số công cụ của bên thứ ba?
(Chú thích: cmp -l
nên được giết bằng lửa, nó sử dụng một hệ thập phân cho các offset và bát phân cho các byte.)
253
2018-03-29 15:28
gốc
Các câu trả lời:
Điều này sẽ in offset và byte trong hex:
cmp -l file1.bin file2.bin | gawk '{printf "%08X %02X %02X\n", $1, strtonum(0$2), strtonum(0$3)}'
Hay làm $1-1
để có bản in offset đầu tiên được in ở 0.
cmp -l file1.bin file2.bin | gawk '{printf "%08X %02X %02X\n", $1-1, strtonum(0$2), strtonum(0$3)}'
Không may, strtonum()
cụ thể cho GAWK, vì vậy đối với các phiên bản khác của awk — ví dụ: mawk — bạn sẽ cần phải sử dụng hàm chuyển đổi bát phân sang thập phân. Ví dụ,
cmp -l file1.bin file2.bin | mawk 'function oct2dec(oct, dec) {for (i = 1; i <= length(oct); i++) {dec *= 8; dec += substr(oct, i, 1)}; return dec} {printf "%08X %02X %02X\n", $1, oct2dec($2), oct2dec($3)}'
Bị hỏng để dễ đọc:
cmp -l file1.bin file2.bin |
mawk 'function oct2dec(oct, dec) {
for (i = 1; i <= length(oct); i++) {
dec *= 8;
dec += substr(oct, i, 1)
};
return dec
}
{
printf "%08X %02X %02X\n", $1, oct2dec($2), oct2dec($3)
}'
143
2018-03-29 16:30
Như ~ quack chỉ ra:
% xxd b1 > b1.hex
% xxd b2 > b2.hex
Và sau đó
% diff b1.hex b2.hex
hoặc là
% vimdiff b1.hex b2.hex
137
2018-03-29 16:07
Thử diff
trong sự kết hợp sau của thay thế quá trình zsh / bash và colordiff
trong CLI:
diff -y <(xxd foo1.bin) <(xxd foo2.bin) | colordiff
Ở đâu:
-y
cho bạn thấy sự khác biệt song song (tùy chọn)
xxd
là công cụ CLI để tạo đầu ra hexdump của tệp nhị phân
colordiff
sẽ tô màu diff
đầu ra (cài đặt qua: sudo apt-get install colordiff
)
- thêm vào
-W200
đến diff
cho đầu ra rộng hơn
Gợi ý:
- nếu tệp lớn, hãy thêm giới hạn (ví dụ:
-l1000
) cho mỗi xxd
Đầu ra mẫu:

57
2017-09-05 21:14
Có một công cụ gọi là DHEX có thể thực hiện công việc và có một công cụ khác được gọi là VBinDiff.
Để có cách tiếp cận đúng dòng lệnh, hãy thử JDIFF.
48
2018-03-29 15:41
Phương thức hoạt động để bổ sung / xóa byte
diff <(od -An -tx1 -w1 -v file1) \
<(od -An -tx1 -w1 -v file2)
Tạo một trường hợp thử nghiệm với một lần loại bỏ byte 64:
for i in `seq 128`; do printf "%02x" "$i"; done | xxd -r -p > file1
for i in `seq 128`; do if [ "$i" -ne 64 ]; then printf "%02x" $i; fi; done | xxd -r -p > file2
Đầu ra:
64d63
< 40
Nếu bạn cũng muốn xem phiên bản ASCII của ký tự:
bdiff() (
f() (
od -An -tx1c -w1 -v "$1" | paste -d '' - -
)
diff <(f "$1") <(f "$2")
)
bdiff file1 file2
Đầu ra:
64d63
< 40 @
Thử nghiệm trên Ubuntu 16.04.
tôi thích od
kết thúc xxd
bởi vì:
- nó là POSIX,
xxd
không phải là (đi kèm với Vim)
- có
-An
để xóa cột địa chỉ mà không cần awk
.
Giải thích lệnh:
-An
loại bỏ cột địa chỉ. Điều này quan trọng nếu không tất cả các dòng sẽ khác nhau sau khi thêm / xóa byte.
-w1
đặt một byte trên mỗi dòng, để diff có thể tiêu thụ nó. Nó là rất quan trọng để có một byte trên mỗi dòng, hoặc người nào khác mỗi dòng sau khi xóa sẽ trở thành ngoài giai đoạn và khác nhau. Thật không may, đây không phải là POSIX, nhưng có trong GNU.
-tx1
là biểu diễn bạn muốn, thay đổi thành bất kỳ giá trị nào có thể, miễn là bạn giữ 1 byte trên mỗi dòng.
-v
ngăn chặn viết tắt lặp lại dấu hoa thị *
có thể can thiệp vào sự khác biệt
paste -d '' - -
tham gia mỗi hai dòng. Chúng ta cần nó vì hex và ASCII đi vào các đường liền kề riêng biệt. Được lấy từ: https://stackoverflow.com/questions/8987257/concatenating-every-other-line-with-the-next
- chúng tôi sử dụng dấu ngoặc đơn
()
định nghĩa bdiff
thay vì {}
để giới hạn phạm vi của hàm bên trong f
, Xem thêm: https://stackoverflow.com/questions/8426077/how-to-define-a-function-inside-another-function-in-bash
Xem thêm:
25
2018-04-04 20:31
Câu trả lời ngắn
vimdiff <(xxd -c1 -p first.bin) <(xxd -c1 -p second.bin)
Khi sử dụng hexdumps và văn bản khác để so sánh các tệp nhị phân, đặc biệt là xxd
, việc bổ sung và loại bỏ các byte trở thành thay đổi trong việc giải quyết có thể gây khó khăn cho việc xem. Phương thức này cho biết xxd không xuất ra địa chỉ và chỉ xuất ra một byte trên mỗi dòng, từ đó cho biết chính xác byte nào đã được thay đổi, thêm vào hoặc loại bỏ. Bạn có thể tìm thấy các địa chỉ này sau bằng cách tìm kiếm chuỗi các byte thú vị trong một hexdump "bình thường" hơn (đầu ra của xxd first.bin
).
12
2018-04-22 12:10
Tôi muốn giới thiệu hexdump để bán các tệp nhị phân sang định dạng văn bản và kdiff3 để xem khác.
hexdump myfile1.bin > myfile1.hex
hexdump myfile2.bin > myfile2.hex
kdiff3 myfile1.hex myfile2.hex
10
2018-06-12 07:46
Các hexdiff
là một chương trình được thiết kế để thực hiện chính xác những gì bạn đang tìm kiếm.
Sử dụng:
hexdiff file1 file2
Nó hiển thị hex (và 7-bit ASCII) của hai tập tin ở trên kia, với bất kỳ sự khác biệt nào được đánh dấu. Nhìn vào man hexdiff
để các lệnh di chuyển trong tệp và đơn giản q
sẽ bỏ thuốc lá.
4
2017-10-07 04:11
Nó có thể không trả lời đúng câu hỏi, nhưng tôi sử dụng nó cho các nhị phân khác:
gvim -d <(xxd -c 1 ~/file1.bin | awk '{print $2, $3}') <(xxd -c 1 ~/file2.bin | awk '{print $2, $3}')
Nó in cả hai tập tin ra dưới dạng hex và ASCII các giá trị, một byte trên mỗi dòng, và sau đó sử dụng cơ sở diff của Vim để hiển thị chúng một cách trực quan.
3
2017-09-07 15:47
https://security.googleblog.com/2016/03/bindiff-now-available-for-free.html
BinDiff là một công cụ giao diện người dùng tuyệt vời để so sánh các tệp nhị phân đã được mở nguồn gần đây.
0
2018-03-23 20:18
dhex http://www.dettus.net/dhex/
DHEX không chỉ là một trình soạn thảo hex khác: Nó bao gồm một chế độ khác, có thể được sử dụng để so sánh dễ dàng và thuận tiện hai tệp nhị phân. Kể từ khi nó được dựa trên ncurses và là themeable, nó có thể chạy trên bất kỳ số lượng các hệ thống và kịch bản. Với việc sử dụng nhật ký tìm kiếm, có thể theo dõi các thay đổi trong các lần lặp lại các tệp khác nhau một cách dễ dàng.
0
2017-08-18 11:25