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.zip
posteriormente.)
Para verificar isso, começando com o código-fonte Info-ZIP para zip
3.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.txt
alterando o byte no deslocamento 0xB137. Eu tenho o comportamento oposto ao que você observou; unzip -v
relatou o CRC alterado a partir do diretório central, mas unzip -t
e zip -T
relatou 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.txt
deslocamento 0x10 causou os dois unzip -t
e zip -T
relatou um erro do CRC, mas zip -F
nã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 -T
e unzip -t
; zip -F
também reclamará da incompatibilidade local-central
- local e central:
zip -T
eunzip -t
- somente central:
zip -T
e unzip -t
não irá reclamar, mas zip -F
indicará uma incompatibilidade local-central
(Note que por padrão zip -T
simplesmente usa unzip -tqq
, por isso zip -T
e unzip -t
realmente são equivalentes Você pode ler o. unzip
Có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
?