我需要在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位,所以我一定做错了。 请解释我做错了什么。
答案 0 :(得分:2)
不,不是;这是5位:但是1D是8位
>>> bin(0x1d)
'0b11101'
此模块定义事物的方式(参见_verifyPoly
函数)向下舍入,因此这被视为“4位多项式”。 “8位多项式”必须介于0x100
和0x1ff
之间(包括)。当然,该范围内的大多数多项式都不会给出有用的结果,但它们至少可以由这个模块处理。
请解释我做错了什么。
正如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
。
或者,如果adler32
和crc32
由于某种原因不足够,无论出于什么原因,我都会打赌你实际上并不需要校验和但需要真正的哈希值,而且更好CRC多项式不能帮助你;你想要一个不同的算法,可能是hashlib
之外的东西。