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.zip
sesudahnya.)
Untuk memverifikasi ini, dimulai dengan kode sumber Info-ZIP untuk zip
3.0, saya membuat file sebagai berikut:
zip -9 test.zip zip.txt zipup.c
Saya kemudian merusak direktori pusat CRC zip.txt
dengan mengubah byte pada offset 0xB137. Saya mendapatkan perilaku yang berlawanan dengan apa yang Anda amati; unzip -v
melaporkan CRC yang diubah dari direktori pusat, tetapi unzip -t
dan zip -T
melaporkan 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.txt
pada offset 0x10 menyebabkan keduanya unzip -t
dan zip -T
melaporkan kesalahan CRC, tetapi zip -F
tidak menemukan kesalahan.
Jadi dari percobaan saya, ketidaksesuaian antara isi entri arsip dan CRC-nya dapat dideteksi sebagai berikut:
- hanya lokal:
zip -T
dan unzip -t
; zip -F
juga akan mengeluh tentang ketidakcocokan lokal-pusat
- lokal dan pusat:
zip -T
danunzip -t
- hanya pusat:
zip -T
dan unzip -t
tidak akan mengeluh, tetapi zip -F
akan menunjukkan ketidakcocokan lokal-sentral
(Perhatikan bahwa secara default zip -T
hanya menggunakan unzip -tqq
, jadi zip -T
dan unzip -t
benar-benar setara. Anda dapat membaca unzip
kode 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
?