Beim Versuch, ein Archiv zu reparieren, werden die lokalen und zentralen CRCs verglichen, und wenn dies mit Archivtests kombiniert wird, können alle CRCs überprüft werden. Wenn du läufst
unzip -t archive.zip
und
zip -F archive.zip --out archivefix.zip
und beklagen Sie sich auch nicht, das heißt, der Inhalt des Archivs stimmt sowohl mit dem zentralen als auch mit dem lokalen CRC überein. (Sie können archivefix.zip
danach löschen .)
Um dies zu überprüfen zip
, habe ich beginnend mit dem Info-ZIP-Quellcode für 3.0 eine Datei wie folgt erstellt:
zip -9 test.zip zip.txt zipup.c
Ich habe dann das zentrale CRC-Verzeichnis beschädigt, zip.txt
indem ich das Byte bei Offset 0xB137 geändert habe. Ich habe das Gegenteil von dem, was Sie beobachtet haben; unzip -v
meldete die geänderte CRC aus dem zentralen Verzeichnis, aber unzip -t
und zip -T
meldete, dass die Datei in Ordnung war (Prüfung gegen die lokale CRC).
Aber rennen
zip -F test --out testfix
berichtet
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
In der "korrigierten" Datei ist weiterhin die geänderte CRC für aufgeführt zip.txt
.
Das Ändern des lokalen CRC für zip.txt
bei Offset 0x10 verursachte beide unzip -t
und zip -T
einen CRC - Fehler zu berichten, aber zip -F
nichts falsch erkennen.
Aufgrund meiner Experimente können also Abweichungen zwischen den Inhalten eines Archiveintrags und seinen CRCs wie folgt festgestellt werden:
- nur lokal:
zip -T
und unzip -t
; zip -F
wird sich auch über die lokal-zentrale Fehlpaarung beschweren
- lokal und zentral:
zip -T
undunzip -t
- Nur zentral:
zip -T
und unzip -t
beschwert sich nicht, weist jedoch zip -F
auf eine lokal-zentrale Nichtübereinstimmung hin
(Beachten Sie, dass standardmäßig zip -T
verwendet einfach unzip -tqq
, so zip -T
und unzip -t
wirklich gleichwertig sind Sie das lesen können. unzip
Quellcode überprüfen, ob ein Archiv Prüfung vergleicht wirklich die lokale CRC, nicht die mittlere, sucht extract_or_test_files()
, extract_or_test_entrylist()
und extract_or_test_member()
, alles in extract.c
.)
unzip -t
?