Спроба виправити архів порівнятиме локальні та центральні CRC, а поєднання цього з тестами архіву дозволить перевірити всі CRC. Якщо ти біжиш
unzip -t archive.zip
і
zip -F archive.zip --out archivefix.zip
і не скаржаться, це означає, що вміст архіву відповідає як центральній, так і місцевій ЦРЛ. (Ви можете archivefix.zipпотім видалити .)
Щоб перевірити це, починаючи з вихідного коду Info-ZIP для zip3.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?