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.zipsau đó.)
Để xác minh điều này, bắt đầu với mã nguồn Info-ZIP cho zip3.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.txtbằ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 -tvà zip -Tbá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 -tvà zip -Tbáo cáo lỗi CRC, nhưng zip -Fkhô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 -Tvà unzip -t; zip -Fcũ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 -Tvàunzip -t
- chỉ trung tâm:
zip -Tvà unzip -tsẽ không khiếu nại, nhưng zip -Fsẽ 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 -Tchỉ đơn giản là sử dụng unzip -tqq, vì vậy zip -Tvà unzip -tthực sự là tương đương. Bạn có thể đọc unzipmã 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?