Intentar arreglar un archivo comparará los CRC locales y centrales, y combinar eso con las pruebas de archivo permitirá verificar todos los CRC. Si tu corres
unzip -t archive.zip
y
zip -F archive.zip --out archivefix.zip
y tampoco se quejan, eso significa que el contenido del archivo coincide con los CRC centrales y locales. (Puede eliminar archivefix.zip
después).
Para verificar esto, comenzando con el código fuente Info-ZIP para zip
3.0, creé un archivo de la siguiente manera:
zip -9 test.zip zip.txt zipup.c
Luego corrompí el directorio central CRC zip.txt
cambiando el byte en el desplazamiento 0xB137. Obtuve el comportamiento opuesto a lo que observaste; unzip -v
informó el CRC alterado desde el directorio central, pero unzip -t
e zip -T
informó de que el archivo estaba bien (comprobación con la CDN local).
Pero corriendo
zip -F test --out testfix
reportado
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
El archivo "corregido" todavía enumeraba el CRC alterado para zip.txt
.
La alteración de la CRC local zip.txt
en el desplazamiento 0x10 causó ambos unzip -t
e zip -T
informar un error de CRC, pero zip -F
no detectó nada malo.
Por lo tanto, a partir de mis experimentos, los desajustes entre el contenido de una entrada de archivo y sus CRC se pueden detectar de la siguiente manera:
- solo local:
zip -T
y unzip -t
; zip -F
también se quejará de la discordancia local-central
- local y central:
zip -T
yunzip -t
- solo central:
zip -T
y unzip -t
no se quejará, pero zip -F
indicará un desajuste local-central
(Tenga en cuenta que por defecto zip -T
simplemente utiliza unzip -tqq
, por lo que zip -T
y unzip -t
realmente son equivalentes Puede leer el. unzip
Código fuente para comprobar que las pruebas de un archivo realmente compara el CRC local, no el central, buscar extract_or_test_files()
, extract_or_test_entrylist()
y extract_or_test_member()
, en todo extract.c
.)
unzip -t
?