Il tentativo di riparare un archivio confronterà i CRC locali e centrali e combinandolo con i test di archivio consentirà di verificare tutti i CRC. Se corri
unzip -t archive.zip
e
zip -F archive.zip --out archivefix.zip
e nessuno si lamenta, ciò significa che i contenuti dell'archivio corrispondono sia ai CRC centrali che a quelli locali. (Puoi cancellarearchivefix.zip seguito.)
Per verificarlo, a partire dal codice sorgente Info-ZIP per zip3.0, ho creato un file come segue:
zip -9 test.zip zip.txt zipup.c
Ho quindi corrotto la directory centrale CRC per zip.txt cambiando il byte all'offset 0xB137. Ho avuto il comportamento opposto a quello che hai osservato; unzip -vsegnalato il CRC modificato dalla directory centrale, maunzip -t e zip -Tha riferito che il file era OK (il controllo contro il CRC locale).
Ma correndo
zip -F test --out testfix
segnalati
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
Il file "corretto" elencava ancora il CRC modificato per zip.txt .
La modifica del CRC locale per l' zip.txtoffset 0x10 ha causato sia unzip -tezip -T segnalato un errore CRC, ma zip -Fnon ha rilevato alcun errore.
Pertanto, dai miei esperimenti, le discrepanze tra il contenuto di una voce di archivio e i suoi CRC possono essere rilevate come segue:
- solo locale:
zip -Te unzip -t;zip -Fsi lamenterà anche della mancata corrispondenza locale-centrale
- locale e centrale:
zip -Teunzip -t
- solo centrale:
zip -Te unzip -tnon si lamenterà, ma zip -Findicherà una mancata corrispondenza locale-centrale
(Si noti che di default zip -Tusa semplicemente unzip -tqq, in modo zip -Te unzip -tin realtà sono equivalenti È possibile leggere il. unzipCodice sorgente per controllare che il test di un archivio confronta davvero il CRC locale, non quello centrale, look per extract_or_test_files(), extract_or_test_entrylist()e extract_or_test_member(), il tutto in extract.c.)
unzip -t?