RarEntry::getCrc() 會回傳一個小寫的十六進位字串(例如 'bf6fa85c'),與 hash_... 函式相同,使用與 'crc32b' 演算法相同的 polynomial(多項式)。
因此,它可以用於在串流解壓縮後檢查 CRC。
<?php
$archive_name = 'archive.rar';
$entry_name = 'someentry.ext';
$rar = RarArchive::open($archive_name) or die("無法開啟壓縮檔 $archive_name");
if ($rar->isBroken()) {
die("壓縮檔已損壞!");
}
$entry = $rar->getEntry($entry_name) or die("找不到項目 $entry_name");
$stream = $entry->getStream() or die("無法開啟串流");
$crc = hash_init('crc32b'); // 初始化雜湊函式
while (!feof($stream)) {
$s = fread($stream, 8192);
if ($s === false) {
// 讀取錯誤 (不要使用 fread(...) or die(...),因為 fread 可能回傳 '0'!)
die('讀取壓縮檔時發生錯誤。');
}
hash_update($crc, $s); // 更新雜湊值
// ...
// 使用 $s 進行任何操作
}
fclose($stream);
$got_crc = hash_final($crc);
$need_crc = $entry->getCrc();
print("取得的 CRC: $got_crc" . PHP_EOL);
print("需要的 CRC: $need_crc" . PHP_EOL);
if ($got_crc != $need_crc) {
// 回滾
print("抱歉,檔案不正確!". PHP_EOL);
} else {
print("一切正常". PHP_EOL);
}
?>