Próba naprawienia archiwum spowoduje porównanie lokalnych i centralnych CRC, a połączenie tego z testami archiwalnymi pozwoli na sprawdzenie wszystkich CRC. Jeśli uciekniesz
unzip -t archive.zip
i
zip -F archive.zip --out archivefix.zip
i nie narzekają, co oznacza, że zawartość archiwum pasuje zarówno do centralnej, jak i lokalnej CRC. (Możesz archivefix.zip
później usunąć .)
Aby to sprawdzić, zaczynając od kodu źródłowego Info-ZIP dla zip
3.0, utworzyłem plik w następujący sposób:
zip -9 test.zip zip.txt zipup.c
Następnie uszkodziłem CRC katalogu centralnego, zip.txt
zmieniając bajt z przesunięciem 0xB137. Mam zachowanie przeciwne do tego, co zaobserwowałeś; unzip -v
Podawane zmienionego CRC z katalogu centralnego, ale unzip -t
i zip -T
poinformował, że plik był OK (sprawdzanie przeciwko miejscowym CRC).
Ale działa
zip -F test --out testfix
zgłoszone
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
W „poprawionym” pliku nadal znajduje się zmieniony CRC zip.txt
.
Zmiana lokalnego CRC zip.txt
na przesunięcie 0x10 spowodowała oba unzip -t
i zip -T
zgłosiła błąd CRC, ale zip -F
nie zauważyła nic złego.
Zatem z moich eksperymentów rozbieżności między zawartością wpisu archiwum a jego CRC można wykryć w następujący sposób:
- tylko lokalnie:
zip -T
i unzip -t
; zip -F
będzie również narzekać na niedopasowanie centralne na szczeblu lokalnym
- lokalny i centralny:
zip -T
iunzip -t
- tylko centralne:
zip -T
i unzip -t
nie będzie narzekać, ale zip -F
wskaże niedopasowanie lokalne i centralne
(Zauważ, że domyślnie zip -T
po prostu wykorzystuje unzip -tqq
, tak zip -T
i unzip -t
naprawdę są równoważne można odczytać. unzip
Kod źródłowy, aby sprawdzić, testując archiwum naprawdę porównuje lokalny CRC, a nie jeden centralny; wygląd extract_or_test_files()
, extract_or_test_entrylist()
a extract_or_test_member()
wszystko w extract.c
.)
unzip -t
?