Python中CRC16-X25自定义计算结果不符问题求助
CRC16-X25自定义计算函数的参数错误排查
我编写了以下Python 3代码用于计算CRC16-X25:
import crcmod # CRC function using the CRC-16-CCITT standard crc16 = crcmod.mkCrcFun(0x11021, initCrc=0xFFFF, xorOut=0xFFFF, rev=True) def calculate_crc(data): return crc16(data) hex_data = '010e00180510100b1b020100000100ff' # Convert the hex string to bytes binary_data = bytes.fromhex(hex_data) # Calculate the CRC crc_value = calculate_crc(binary_data) # Print the CRC value in hexadecimal format print(f'CRC value: {crc_value:04X}')
我尝试过将rev设为True或False,都无法得到预期结果0xAF47。但使用在线工具计算CRC-16/X-25能得到正确结果,且用crcmod.predefined.Crc('x-25')也能得到预期结果,请问自定义的mkCrcFun(0x11021, initCrc=0xFFFF, xorOut=0xFFFF, rev=True)参数哪里出错了?
你的问题出在对mkCrcFun的rev参数理解有误:
- 当设置
rev=True时,crcmod会同时执行三个操作:- 反转输入字节的位序(等同于
refin=True) - 反转输出CRC的位序(等同于
refout=True) - 反转多项式的位序
- 反转输入字节的位序(等同于
- 而CRC-16/X-25的标准参数要求:输入输出位序反转,但多项式保持原有的
0x11021(带最高位的形式),不需要反转。
直接用rev=True会导致多项式被错误反转,最终计算结果偏差。
正确的自定义参数应该单独指定refin和refout为True,同时不依赖rev参数(或显式设rev=False),这样多项式不会被反转:
import crcmod # 正确的CRC16-X25自定义函数 crc16 = crcmod.mkCrcFun(0x11021, initCrc=0xFFFF, xorOut=0xFFFF, refin=True, refout=True) def calculate_crc(data): return crc16(data) hex_data = '010e00180510100b1b020100000100ff' binary_data = bytes.fromhex(hex_data) crc_value = calculate_crc(binary_data) print(f'CRC value: {crc_value:04X}') # 输出:CRC value: AF47
这个配置完全匹配crcmod.predefined.Crc('x-25')的底层参数(多项式0x1021不带最高位,对应mkCrcFun的0x11021,初始值0xFFFF,异或输出0xFFFF,输入输出位序反转),因此能得到正确结果。
内容的提问来源于stack exchange,提问作者Mert Mertce
相关产品推荐
相关产品推荐

