You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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会同时执行三个操作:
    1. 反转输入字节的位序(等同于refin=True)
    2. 反转输出CRC的位序(等同于refout=True)
    3. 反转多项式的位序
  • 而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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 14:42:05