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