PHP Conference Japan 2024

RarEntry::getCrc

(PECL rar >= 0.1)

RarEntry::getCrc取得項目的 CRC

說明

public RarEntry::getCrc(): 字串

返回封存項目 CRC 的十六進位字串表示。

參數

此函式沒有參數。

回傳值

返回封存項目的 CRC 或錯誤時返回 false

更新日誌

版本 說明
PECL rar 2.0.0 此方法現在會針對多卷封存返回正確的值。

新增筆記

使用者貢獻的筆記 1 則筆記

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