Python:在zlib.crc32中设置生成器多项式



我正在尝试使用zlib.crc32在Python中计算CRC。我希望能够设置CRC的生成器多项式,但我找不到任何文档。所以问题是:这能做到吗?

我知道有crcmod库可以做到这一点,但在我的情况下,我只想使用标准的Python库,不想安装任何外部库。有没有标准的Python库可以用来计算CRC,我可以定义它的生成器多项式?

crcmod中,它被执行为:

import crcmod
crc32 = crcmod.Crc(poly=0x104c11db7, rev=True, initCrc=0, xorOut=0xFFFFFFFF)
crc32.update(bytearray(input_string))

在上述代码中,CCD_ 4是生成多项式。

否,多项式和其他CRC参数在zlib中进行硬编码。

然而,这些参数生成的CRC-32是zlib实现的CRC。您可以使用zlib.crc32

>>> import crcmod
>>> crc32 = crcmod.mkCrcFun(poly=0x104c11db7, rev=True, initCrc=0, xorOut=0xFFFFFFFF)
>>> print(hex(crc32(b'123456789')))
0xcbf43926
>>> import zlib
>>> print(hex(zlib.crc32(b'123456789')))
0xcbf43926

更新:

从评论来看,速度并不重要,他们想要一个不同的CRC多项式。

这里有一个简单的CRC-32实现,假设rev=True,您可以更改或参数化多项式、初始值和最终异或:

def crc32(msg):
crc = 0xffffffff
for b in msg:
crc ^= b
for _ in range(8):
crc = (crc >> 1) ^ 0xedb88320 if crc & 1 else crc >> 1
return crc ^ 0xffffffff
print(hex(crc32(b'123456789')))

打印:0xcbf43926

如果您需要更快的东西,那么您需要为字节表驱动的CRC实现生成一个表。

更新:

当最初的发帖者继续在评论中透露关于他们实际问题的微小信息时(而不是简单地说他们在问题中想做什么(,我们了解到他们也需要生成前向CRC(rev=False(,特别是CRC-32/MPEG-2。这里有一个简单的代码:

def crc32mpeg2(msg):
crc = 0xffffffff
for b in msg:
crc ^= b << 24
for _ in range(8):
crc = (crc << 1) ^ 0x04c11db7 if crc & 0x80000000 else crc << 1
return crc & 0xffffffff
print(hex(crc32mpeg2(b'123456789')))

打印:0x376e6e7