我知道来自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)?
答案 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?