RarEntry::getCrc

(PECL rar >= 0.1)

RarEntry::getCrcエントリの CRC を取得する

説明

public RarEntry::getCrc(): string

アーカイブエントリの CRC を、十六進文字列表現で返します。

パラメータ

この関数にはパラメータはありません。

戻り値

アーカイブエントリの CRC、あるいはエラー時に false を返します。

変更履歴

バージョン 説明
PECL rar 2.0.0 複数ボリュームのアーカイブでも正しい値を返すようになりました。

add a note add a note

User Contributed Notes 1 note

up
0
aterlux at mail dot ru
6 years ago
RarEntry::getCrc() returs a lowercase hex-string (e.g. 'bf6fa85c') the same as hash_... functions, using the same polynomial as 'crc32b' algorithm.
So, it can be used to check CRC after a stream unpacking:

<?php
  $archive_name
= 'archive.rar';

 
$entry_name = 'someentry.ext';

 
$rar = RarArchive::open($archive_name) or die("Cannot open archive $archive_name");

  if (
$rar->isBroken()) {
    die(
"The archive is broken!");
  }

 
$entry = $rar->getEntry($entry_name) or die("Cannot find entry $entry_name");

 
$stream = $entry->getStream() or die("Cannot open stream");

 
$crc = hash_init('crc32b'); // Initializing the hash function

 
while (!feof($stream)) {
   
$s = fread($stream, 8192);
    if (
$s === false) {
       
// Error reading (do not use fread(...) or die(...), because fread can return '0'!)
     
die('Error reading the compressed file.');
    }
   
hash_update($crc, $s); // updating the hash

    // ...
    // Do whatever with the $s
 
}

 
fclose($stream);

 
$got_crc = hash_final($crc);
 
$need_crc = $entry->getCrc();

  print(
"Got CRC: $got_crc" . PHP_EOL);
  print(
"Need CRC: $need_crc" . PHP_EOL);

  if (
$got_crc != $need_crc) {
   
// rollback
   
print("Sorry guys, the file was incorrect!" . PHP_EOL);
  } else {
    print(
"Everything is ok" . PHP_EOL);
  }
?>
To Top