2011-09-19 95 views
1

說到這個:http://www.win-rar.com/index.php?id=24&kb_article_id=162如何計算WinRAR文件頭的CRC?

我能夠做計算歸檔頭(MAIN_HEAD)的正確CRC:

$crc = crc32(mb_substr($data, $blockOffset + 2, 11, '8bit')); 
$crc = dechex($crc); 
$crc = substr($crc, -4, 2) . substr($crc, -2, 2); 
$crc = hexdec($crc); 

第一行寫着「CRC領域的HEAD_TYPE到RESERVED2「作爲文件中的狀態。正如我所指出的那樣,它對檔案頭部來說工作正常。

當我嘗試計算一個文件頭的CRC時,它總是會因不明原因吐出錯誤的CRC。我按照文檔所述 - 「從HEAD_TYPE到FILEATTR的字段的CRC」,但它根本不起作用。如果文檔不正確,我也嘗試了不同的讀長度變化,實際上它可能是從HEAD_TYPE到FILE_NAME。一切都沒有成功。

任何人都可以給我一個提示嗎?我也檢查了unrar源代碼,但它並沒有讓我變得更聰明,可能是因爲我根本不知道C語言......

回答

1

我寫了一些代碼來做同樣的事情。下面是它爲更好地理解一些附加的片段:

$this->fh = $fileHandle; 
$this->startOffset = ftell($fileHandle); // current location in the file 

// reading basic 7 byte header block 
$array = unpack('vheaderCrc/CblockType/vflags/vheaderSize', fread($this->fh, 7)); 
$this->headerCrc = $array['headerCrc']; 
$this->blockType = $array['blockType']; 
$this->flags = $array['flags']; 
$this->hsize = $array['headerSize']; 
$this->addSize = 0; // size of data after the header 


// -- check CRC of block header -- 
$offset = ftell($this->fh); 
fseek($this->fh, $this->startOffset + 2, SEEK_SET); 
$crcData = fread($this->fh, $this->hsize - 2); 
// only the 4 lower order bytes are used 
$crc = crc32($crcData) & 0xffff; 
// igonore blocks with no CRC set (same as twice the blockType) 
if ($crc !== $this->headerCrc && $this->headerCrc !== 0x6969 // SRR Header 
      && $this->headerCrc !== 0x6a6a // SRR Stored File 
      && $this->headerCrc !== 0x7171 // SRR RAR block 
      && $this->blockType !== 0x72 // RAR marker block (fixed: magic number) 
) { 
    array_push($warnings, 'Invalid block header CRC found: header is corrupt.'); 
} 
// set offset back to where we started from 
fseek($this->fh, $offset, SEEK_SET); 

我測試了它的一對夫婦的SRR文件,它按預期工作。我開始閱讀基本的7字節標題。標題的大小可以在那裏找到。我用它來獲取crc32函數的正確數據量。我注意到,當您將其轉換爲十六進制時,在比較'0f00'!='f00'時可能會出現誤報。你需要用零填充它。這就是爲什麼我保留crc32()和unpack()的十進制表示以進行比較。另外,如果設置了一些標題標記,則文件塊的字段數可能會有所不同:可能是您輸入了錯誤的大小。

+0

謝謝!將盡快嘗試。 – nginxguy

+0

如果其他人感興趣,可以在這裏找到一些讀取RAR文件的PHP代碼: http://www.newznab.com/download.html – Gfy