Crcmod python3多项式错误

时间:2013-12-10 21:03:00

标签: python python-3.x checksum crc

我需要在python3程序中使用crc校验和,但我对crc的了解几乎不存在。

这是我写的测试代码

import crcmod

crc_func = crcmod.mkCrcFun(0x1d, initCrc=0x07, xorOut=0x00)
print(hex(crc_func(b'123456789')))

当我运行它时,我收到以下错误:

ValueError: The degree of the polynomial must be 8, 16, 24, 32 or 64

但1D是8位,所以我一定做错了。 请解释我做错了什么。

1 个答案:

答案 0 :(得分:2)

  

但是1D是8位

不,不是;这是5位:

>>> bin(0x1d)
'0b11101'

此模块定义事物的方式(参见_verifyPoly函数)向下舍入,因此这被视为“4位多项式”。 “8位多项式”必须介于0x1000x1ff之间(包括)。当然,该范围内的大多数多项式都不会给出有用的结果,但它们至少可以由这个模块处理。


  

请解释我做错了什么。

正如the docs所说:

  

该整数中的位是多项式的系数。唯一允许的多项式是生成8,16,24,32或64位CRC的那些。

0x1d不会生成8次多项式。


如果这对你没有任何意义,那么,docs明确地说,就在右上方:

  

此程序包中没有尝试解释CRC的工作原理......

     

由您决定在您的应用程序中使用哪些多项式。一些常见的CRC算法是在crcmod.predefined中预定义的。如果有人未指定要使用的多项式,则需要进行一些研究以找到适合您的应用的多项式。单元测试脚本test.py中提供了示例。

如果您不想了解CRC的工作原理并想知道如何自己设计和编码适当的多项式,只需使用predefined之一。


更一般地说,如果您没有考虑特定的CRC多项式,或者甚至不了解这意味着什么,那么您可能没有理由首先使用此模块。如果您只是“需要使用crc校验和”,那么stdlib中已经有一个非常好的CRC函数zlib.crc32

就此而言,如果它不必实际 CRC,只需要一个相当可靠的校验和,你可能需要zlib.adler32

或者,如果adler32crc32由于某种原因不足够,无论出于什么原因,我都会打赌你实际上并不需要校验和但需要真正的哈希值,而且更好CRC多项式不能帮助你;你想要一个不同的算法,可能是hashlib之外的东西。