Tenter de réparer une archive comparera les CRC locaux et centraux, et la combiner avec des tests d'archives permettra de vérifier tous les CRC. Si vous courez
unzip -t archive.zip
et
zip -F archive.zip --out archivefix.zip
et ni l'un ni l'autre ne se plaignent, cela signifie que le contenu de l'archive correspond à la fois aux CRC central et local. (Vous pouvez supprimer archivefix.zip
ensuite.)
Pour vérifier cela, en commençant par le code source Info-ZIP pour zip
3.0, j'ai créé un fichier comme suit:
zip -9 test.zip zip.txt zipup.c
J'ai ensuite corrompu le répertoire central CRC pour zip.txt
en modifiant l'octet à l'offset 0xB137. J'ai eu le comportement opposé à ce que vous avez observé; unzip -v
a rapporté le CRC modifié à partir du répertoire central, mais unzip -t
et a zip -T
indiqué que le dossier était OK (vérification contre le CRC local).
Mais courir
zip -F test --out testfix
signalé
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
Le fichier "corrigé" répertorie toujours le CRC modifié pour zip.txt
.
La modification du CRC local pour le zip.txt
décalage 0x10 a causé les deux unzip -t
et zip -T
pour signaler une erreur CRC, mais zip -F
n'a rien détecté de mal.
Ainsi, d'après mes expériences, les décalages entre le contenu d'une entrée d'archive et ses CRC peuvent être détectés comme suit:
- local uniquement:
zip -T
et unzip -t
; zip -F
se plaindra également de l'inadéquation local-central
- local et central:
zip -T
etunzip -t
- central uniquement:
zip -T
et unzip -t
ne se plaindra pas, mais zip -F
indiquera un décalage local-central
(Notez que par défaut zip -T
utilise simplement unzip -tqq
, so zip -T
et unzip -t
vraiment sont équivalents. Vous pouvez lire le unzip
code source pour vérifier que tester une archive compare vraiment le CRC local, pas le central; recherchez extract_or_test_files()
, extract_or_test_entrylist()
et extract_or_test_member()
, le tout extract.c
.)
unzip -t
?