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) 时,多项式在实现中位翻转。 0xedb883200x04c11db7 翻转。 如果你想要关于 CRC 及其计算的教程,我推荐这个painless guide。

以上是关于Python:在 zlib.crc32 中设置生成器多项式的主要内容,如果未能解决你的问题,请参考以下文章

Python_CRC32

CRC32 - 更改初始值

在 python 中为大文件创建校验和的最快方法

在STM32CubeMX中设置USB设备名称生成USB项目

Python中设置指定窗口为前台活动窗口(最顶层窗口)win32gui

python 通过信号自动生成蛞蝓,这里不再需要使用视图,直接在模型中设置即可