Python:在 zlib.crc32 中设置生成器多项式
Posted
技术标签:
【中文标题】Python:在 zlib.crc32 中设置生成器多项式【英文标题】:Python: setting generator Polynomial in zlib.crc32 【发布时间】:2022-01-08 08:47:44 【问题描述】:我正在尝试使用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))
在上面的代码中,poly
是生成多项式。
【问题讨论】:
除非它存在但文档中没有提到,否则没有直接的方法可以使用zlib
模块。
谢谢@JohnColeman。你知道任何其他可以做到这一点的标准 Python 库吗?
我认为标准库中没有。如果需要,您可以在原始 python 中实现它。关于 CRC 的 Wikipedia 文章有一个 Python 实现(尽管它似乎是为教学而不是效率而设计的)。
由于我没有安装软件包的权限,我可以将库的所有文件复制到一个文件夹并指示 python 在该文件夹中查看 crc 文件吗?
【参考方案1】:
不,多项式和其他 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
更新:
在 cmets 看来,速度并不重要,他们想要不同的 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 实现生成一个表。
更新:
由于原始发帖人继续在 cmets 中漏出有关他们实际问题的少量信息(而不是简单地说他们想在问题中做什么),我们了解到他们需要生成一个前向 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
。
【讨论】:
感谢您的回答,但我在crcmod
中使用的生成多项式只是一个示例,我需要根据我的情况对其进行更改。有没有其他标准库可以做到这一点?
那么你应该提出你真正想要什么CRC的问题,而不是错误的CRC。
我想要的CRC对于我的不同情况会有所不同,所以它不仅仅是一个固定的多项式。这就是为什么我要问是否可以定义多项式。
这是同一个多项式。当 CRC 反转 (rev=True
) 时,多项式在实现中位翻转。 0xedb88320
是 0x04c11db7
翻转。
如果你想要关于 CRC 及其计算的教程,我推荐这个painless guide。以上是关于Python:在 zlib.crc32 中设置生成器多项式的主要内容,如果未能解决你的问题,请参考以下文章