Bir arşivi onarmaya çalışmak, yerel ve merkezi CRC'leri karşılaştıracak ve bunu arşiv testleriyle birleştirmek tüm CRC'lerin kontrol edilmesini sağlayacaktır. Eğer koşarsan
unzip -t archive.zip
ve
zip -F archive.zip --out archivefix.zip
ve hiçbiri şikayet etmiyor, bu da arşiv içeriğinin hem merkezi hem de yerel CRC'lerle eşleştiği anlamına geliyor. (Daha archivefix.zip
sonra silebilirsiniz .)
Bunu doğrulamak için zip
3.0 için Info-ZIP kaynak kodundan başlayarak aşağıdaki gibi bir dosya oluşturdum:
zip -9 test.zip zip.txt zipup.c
Daha sonra zip.txt
ofset 0xB137'deki byte'ı değiştirerek CRC'nin merkezi dizinini bozdum. Gözlemlediğinin tam tersi davranışta bulundum; unzip -v
merkez dizinden değişmiş CRC bildirdi, ancak unzip -t
ve zip -T
dosya Tamam (yerel CRC karşı kontrol) olduğunu bildirmiştir.
Ama koşuyor
zip -F test --out testfix
rapor
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
"Düzeltilen" dosya hala değiştirilmiş CRC'yi listeledi zip.txt
.
Yerel CRC değiştirilmesi zip.txt
ofset 0x10 hem sebep unzip -t
ve zip -T
bir CRC hata bildirmek, ancak zip -F
hiçbir şey yanlış nokta yoktu.
Bu yüzden deneylerime göre, bir arşiv girişinin içeriği ile CRC'leri arasındaki uyumsuzluklar aşağıdaki gibi algılanabilir:
- sadece yerel:
zip -T
ve unzip -t
; zip -F
yerel-merkezi uyumsuzluktan da şikayet edecek
- yerel ve merkezi:
zip -T
veunzip -t
- yalnızca merkezi:
zip -T
ve unzip -t
şikayet etmeyecek, ancak zip -F
yerel-merkezi bir uyumsuzluğu gösterecek
(Not Varsayılan Bununla zip -T
basitçe kullanır unzip -tqq
böylece, zip -T
ve unzip -t
gerçekten eşdeğerdir Okuyabiliyorsun. unzip
Bir arşivi test gerçekten yerel CRC değil, merkezi bir karşılaştırır olmadığını kontrol için kaynak kodunu; yönelik bakış extract_or_test_files()
, extract_or_test_entrylist()
ve extract_or_test_member()
, tüm extract.c
.)
unzip -t
?