Python使用crcmod生成自定义CRC32校验和结果与预期不符求助
问题根因
你遇到的结果不匹配问题,核心是crcmod的mkCrcFun参数规则和常规CRC工具的参数定义存在细节差异:
rev参数会同时控制输入字节位反转、输出CRC结果位反转两个动作,不支持两个配置分开设置- 非反转模式下,crcmod的位处理顺序和你使用的在线工具存在默认差异,需要手动适配
修正后可得到预期结果的代码
from crcmod import mkCrcFun # 按32位CRC非反转规则适配位顺序 def reverse_bits(value, bit_len): return int(f'{value:0{bit_len}b}'[::-1], 2) # 原始输入数据 input_data = b'\x0f\x0f\x0f\x0f' # 反转每个字节的位顺序适配crcmod处理逻辑 processed_data = bytes([reverse_bits(b, 8) for b in input_data]) # 传入反转后的32位CRC完整多项式(带最高位1) crc32 = mkCrcFun(0x1EDB88320, 0xFFFFFFFF, True, 0xFFFFFFFF) raw_crc = crc32(processed_data) # 反转最终CRC结果的32位得到匹配值 expected_crc = reverse_bits(raw_crc, 32) print(hex(expected_crc)) # 输出 0x5395e7dd
更简洁的适配方案
如果不想手动处理位顺序,可以直接使用crcmod的Crc类,按以下方式配置即可直接得到正确结果:
import crcmod crc_calc = crcmod.Crc(0x104c11db7, initCrc=0xFFFFFFFF, rev=False, xorOut=0xFFFFFFFF) crc_calc.update(b'\x0f\x0f\x0f\x0f') print(hex(crc_calc.crcValue))
内容的提问来源于stack exchange,提问作者simpleduckman
相关产品推荐
相关产品推荐

