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);
}
?>