Tentar corrigir um arquivo compactado comparará os CRCs locais e centrais e combiná-lo com os testes de arquivamento permitirá que todos os CRCs sejam verificados. Se você correr
unzip -t archive.zip
e
zip -F archive.zip --out archivefix.zip
e nenhuma reclamação, isso significa que o conteúdo do arquivo corresponde aos CRCs centrais e locais. (Você pode excluir archivefix.zipposteriormente.)
Para verificar isso, começando com o código-fonte Info-ZIP para zip3.0, criei um arquivo da seguinte maneira:
zip -9 test.zip zip.txt zipup.c
Eu então corrompi o diretório central CRC zip.txtalterando o byte no deslocamento 0xB137. Eu tenho o comportamento oposto ao que você observou; unzip -vrelatou o CRC alterado a partir do diretório central, mas unzip -te zip -Trelatou que o arquivo foi OK (verificação contra o CRC local).
Mas correndo
zip -F test --out testfix
relatado
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
O arquivo "corrigido" ainda listava a CRC alterada para zip.txt.
Alterar o CRC local para o zip.txtdeslocamento 0x10 causou os dois unzip -te zip -Trelatou um erro do CRC, mas zip -Fnão detectou nada de errado.
Assim, a partir de minhas experiências, as incompatibilidades entre o conteúdo de uma entrada de arquivo e seus CRCs podem ser detectadas da seguinte maneira:
- somente local:
zip -Te unzip -t; zip -Ftambém reclamará da incompatibilidade local-central
- local e central:
zip -Teunzip -t
- somente central:
zip -Te unzip -tnão irá reclamar, mas zip -Findicará uma incompatibilidade local-central
(Note que por padrão zip -Tsimplesmente usa unzip -tqq, por isso zip -Te unzip -trealmente são equivalentes Você pode ler o. unzipCódigo fonte para verificar se testar um arquivo realmente compara o CRC local, e não a um central; olhar para extract_or_test_files(), extract_or_test_entrylist()e extract_or_test_member(), tudo em extract.c.)
unzip -t?