2024 年 PHP 开发者大会 日本站

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
6 年前
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