Попытка исправить архив будет сравнивать локальные и центральные CRC, а сочетание с тестами архива позволит проверить все CRC. Если вы бежите
unzip -t archive.zip
а также
zip -F archive.zip --out archivefix.zip
и ни один не жалуется, что означает, что содержимое архива соответствует как центральному, так и локальному CRC. (Вы можете удалить 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?