如何计算WinRAR文件的CRC?

时间:2015-12-28 12:15:51

标签: crc rar winrar

我知道来自Wikipedia的CRC计算算法。关于RAR文件的结构我读了here。例如,有写道:

  

该文件的幻数为:

   0x 52 61 72 21 1A 07 00
     

以下内容分解描述存档标题:

   0x6152 - HEAD_CRC
   0x72   - HEAD_TYPE
   0x1A21 - HEAD_FLAGS
   0x0007 - HEAD_SIZE

如果我理解正确,HEAD_CRC(0x6152)是标记块(MARK_HEAD)的CRC值。在某处我读到,WinRAR文件的CRC是用标准多项式0xEDB88320计算的,但是当CRC的大小小于4个字节时,必须使用不太重要的字节。在这种情况下(当然,如果我没有正确解决)CRC值是0x6152,所以它有2个字节。现在我不知道,我必须采取哪些字节不太重要。从标准多项式(0xEDB88320)?那么0x8320可能是这个多项式的不太重要的字节。接下来,如果我们已经有正确的多项式,如何计算标记块的CRC(即从以下字节:0x 52 61 72 21 1A 07 00)?

2 个答案:

答案 0 :(得分:2)

对于不是从32位CRC派生的旧格式,可能会进行16位检查。 zip和rar使用的标准32位CRC应用于头的最后五个字节,没有任何部分等于前两个字节。声称双字节检查是32位CRC的低两字节,波兰语页面似乎不正确。

从文档中可以看出,标题是以标准方式构造为旧格式的其他块,因此作者为了好玩而安排了他的格式来给出检查值" Ra&#34 ;这样它就可以说出来了!" Rar!"然后是文本终止控件-Z。

我在unrar源代码中找到了另一个16位检查,但该检查也没有产生这些值。

哦,不,你不能参与CRC多项式,并期望这是一个很好的CRC多项式,用于较小的检查。波兰语的页面是说你要计算完整的32位CRC,然后取结果的低两个字节。但是,这对于幻数标题不起作用。

答案 1 :(得分:0)

安装中包含的每个WinRAR TechNote.txt文件:

  

标记块实际上被视为固定字节序列:0x52 0x61 0x72 0x21 0x1a 0x07 0x00

正如您已经指出的那样,最后您可以阅读:

  

使用标准多项式0xEDB88320计算CRC。如果CRC的大小小于4个字节,则仅使用低位字节。

在Python中,计算和获取2个低阶字节的方式如下:

zlib.crc32(correct_byte_range) & 0xffff

rerar有一些代码可以执行此操作,就像它使用的rarfile库一样。 ReScene .NET source code在C#中有一个用于计算CRC32哈希的算法。另请参阅How do I calculate CRC32 mathematically?