我正在尝试使用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
是生成多项式。
发布于 2021-12-01 19:26:32
不,多项式和其他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
。
https://stackoverflow.com/questions/70189658
复制相似问题