Спроба виправити архів порівнятиме локальні та центральні CRC, а поєднання цього з тестами архіву дозволить перевірити всі CRC. Якщо ти біжиш
unzip -t archive.zip
і
zip -F archive.zip --out archivefix.zip
і не скаржаться, це означає, що вміст архіву відповідає як центральній, так і місцевій ЦРЛ. (Ви можете archivefix.zip
потім видалити .)
Щоб перевірити це, починаючи з вихідного коду Info-ZIP для zip
3.0, я створив файл наступним чином:
zip -9 test.zip zip.txt zipup.c
Потім я пошкодив центральний каталог CRC для zip.txt
, змінивши байт на зміщення 0xB137. Я мав протилежну поведінку до того, що ви спостерігали; unzip -v
повідомили змінену CRC з центрального каталогу, але unzip -t
і zip -T
повідомив про те , що файл був в порядку (перевірка в відношенні місцевого CRC).
Але біг
zip -F test --out testfix
повідомили
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
У "виправленому" файлі все ще перераховано змінений CRC для zip.txt
.
Змінення локальної CRC zip.txt
на зміщення 0x10 спричинило і те, unzip -t
і zip -T
повідомити про помилку CRC, але zip -F
не виявило нічого поганого.
Таким чином, з моїх експериментів можна виявити невідповідність між вмістом архіву та його CRC:
- лише місцеві:
zip -T
і unzip -t
; zip -F
також поскаржиться на невідповідність місцевого центрального
- локальні та центральні:
zip -T
таunzip -t
- лише центральний:
zip -T
і unzip -t
не скаржиться, але zip -F
вкаже на локальну-центральну невідповідність
(Зверніть увагу , що за замовчуванням zip -T
просто використовує unzip -tqq
, так zip -T
і на unzip -t
самому справі еквівалентні Ви можете прочитати. unzip
Вихідний код , щоб перевірити , що тестування архіву дійсно порівнює локальний CRC, а не центральною, шукати extract_or_test_files()
, extract_or_test_entrylist()
і extract_or_test_member()
, все extract.c
.)
unzip -t
?