RarEntry::getCrc() 返回小写十六进制字符串(例如 'bf6fa85c'),与 hash_... 函数相同,使用与 'crc32b' 算法相同的多项式。
因此,它可以用来在流解压后检查 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(...) 或 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);
}
?>