Cố gắng sửa chữa một kho lưu trữ sẽ so sánh các CRC cục bộ và trung tâm, và kết hợp nó với các thử nghiệm lưu trữ sẽ cho phép tất cả các CRC được kiểm tra. Nếu bạn chạy
unzip -t archive.zip
và
zip -F archive.zip --out archivefix.zip
và không phàn nàn, điều đó có nghĩa là nội dung của kho lưu trữ khớp với cả CRC trung tâm và địa phương. (Bạn có thể xóa archivefix.zip
sau đó.)
Để xác minh điều này, bắt đầu với mã nguồn Info-ZIP cho zip
3.0, tôi đã tạo một tệp như sau:
zip -9 test.zip zip.txt zipup.c
Sau đó tôi đã làm hỏng thư mục trung tâm CRC zip.txt
bằng cách thay đổi byte ở offset 0xB137. Tôi có hành vi ngược lại với những gì bạn quan sát; unzip -v
đã báo cáo CRC bị thay đổi từ thư mục trung tâm, nhưng unzip -t
và zip -T
báo cáo rằng tệp này vẫn ổn (kiểm tra đối với CRC cục bộ).
Nhưng đang chạy
zip -F test --out testfix
báo cáo
Fix archive (-F) - assume mostly intact archive
Zip entry offsets do not need adjusting
copying: zip.txt
zip warning: Local Entry CRC does not match CD: zip.txt
copying: zipup.c
Tệp "đã sửa" vẫn liệt kê CRC đã thay đổi cho zip.txt
.
Việc thay đổi CRC cục bộ zip.txt
ở mức bù 0x10 đã gây ra cả hai unzip -t
và zip -T
báo cáo lỗi CRC, nhưng zip -F
không phát hiện ra điều gì sai.
Do đó, từ các thử nghiệm của tôi, có thể phát hiện sự không khớp giữa nội dung của mục lưu trữ và CRC của nó như sau:
- chỉ địa phương:
zip -T
và unzip -t
; zip -F
cũng sẽ phàn nàn về sự không phù hợp giữa địa phương và trung ương
- địa phương và trung ương:
zip -T
vàunzip -t
- chỉ trung tâm:
zip -T
và unzip -t
sẽ không khiếu nại, nhưng zip -F
sẽ chỉ ra sự không phù hợp giữa địa phương và trung ương
(Lưu ý rằng theo mặc định zip -T
chỉ đơn giản là sử dụng unzip -tqq
, vì vậy zip -T
và unzip -t
thực sự là tương đương. Bạn có thể đọc unzip
mã nguồn để kiểm tra xem việc kiểm tra một kho lưu trữ có thực sự so sánh CRC cục bộ, không phải là trung tâm; tìm kiếm extract_or_test_files()
, extract_or_test_entrylist()
và extract_or_test_member()
, tất cả trong extract.c
.)
unzip -t
?