Mencoba untuk memperbaiki arsip akan membandingkan CRC lokal dan pusat, dan menggabungkannya dengan tes arsip akan memungkinkan semua CRC diperiksa. Jika Anda berlari
unzip -t archive.zip
dan
zip -F archive.zip --out archivefix.zip
dan tidak ada keluhan, itu berarti isi arsip cocok dengan CRC pusat dan lokal. (Anda dapat menghapus archivefix.zipsesudahnya.)
Untuk memverifikasi ini, dimulai dengan kode sumber Info-ZIP untuk zip3.0, saya membuat file sebagai berikut:
zip -9 test.zip zip.txt zipup.c
Saya kemudian merusak direktori pusat CRC zip.txtdengan mengubah byte pada offset 0xB137. Saya mendapatkan perilaku yang berlawanan dengan apa yang Anda amati; unzip -vmelaporkan CRC yang diubah dari direktori pusat, tetapi unzip -tdan zip -Tmelaporkan bahwa file itu OK (memeriksa terhadap CRC lokal).
Tapi berlari
zip -F test --out testfix
dilaporkan
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
File "dikoreksi" masih mencantumkan CRC yang diubah untuk zip.txt.
Mengubah CRC lokal untuk zip.txtpada offset 0x10 menyebabkan keduanya unzip -tdan zip -Tmelaporkan kesalahan CRC, tetapi zip -Ftidak menemukan kesalahan.
Jadi dari percobaan saya, ketidaksesuaian antara isi entri arsip dan CRC-nya dapat dideteksi sebagai berikut:
- hanya lokal:
zip -Tdan unzip -t; zip -Fjuga akan mengeluh tentang ketidakcocokan lokal-pusat
- lokal dan pusat:
zip -Tdanunzip -t
- hanya pusat:
zip -Tdan unzip -ttidak akan mengeluh, tetapi zip -Fakan menunjukkan ketidakcocokan lokal-sentral
(Perhatikan bahwa secara default zip -Thanya menggunakan unzip -tqq, jadi zip -Tdan unzip -tbenar-benar setara. Anda dapat membaca unzipkode sumber untuk memeriksa bahwa pengujian arsip benar-benar membandingkan CRC lokal, bukan yang sentral; cari extract_or_test_files(), extract_or_test_entrylist()dan extract_or_test_member(), semuanya extract.c.)
unzip -t?