我正在尝试使用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
。