RarEntry::getCrc

(PECL rar >= 0.1)

RarEntry::getCrc获取条目的 CRC

描述

public RarEntry::getCrc(): string

返回存档条目 CRC 的十六进制字符串表示形式。

参数

此函数没有参数。

返回值

返回存档条目的 CRC,或在错误时返回 false

变更日志

版本 描述
PECL rar 2.0.0 此方法现在返回多卷存档的正确值。

添加注释

用户贡献的注释 1 个注释

aterlux at mail dot ru
5 年前
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);
}
?>
To Top