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

Python: setting generator Polynomial in 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))

在上面的代码中,poly 是生成多项式。

不,多项式和其他 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

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

更新:

随着原始发布者继续在评论中透露有关他们实际问题的微小信息(而不是简单地说出他们想在问题中做什么),我们了解到他们需要生成一个转发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