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

如何正确计算G8501字段的CRC-16/MODBUS校验和?求代码示例

G8501字段校验和计算方法及代码示例

DEX文档中的G85字段(对应G8501)采用**CRC-16/IBM(ARC)**算法计算,和你用的CRC-16/MODBUS核心差异在于初始值、输入输出反转规则,加上计算时必须包含每行结尾的CRLF换行符,这是导致结果不一致的关键。

计算规则细节

  1. 计算范围:从ST段到EA3段的所有内容,必须保留每行结尾的CRLF(\r\n)换行符,不能仅提取文本内容。
  2. CRC-16/IBM算法参数:
    • 多项式:0x8005
    • 初始校验值:0x0000
    • 输入字节:每个字节反转位序
    • 输出校验值:反转位序后异或0x0000

Python代码示例

def crc16_ibm(data: bytes) -> str:
    crc = 0x0000
    polynomial = 0x8005
    for byte in data:
        # 反转当前字节的位序
        reversed_byte = int('{:08b}'.format(byte)[::-1], 2)
        crc ^= reversed_byte << 8
        for _ in range(8):
            if crc & 0x8000:
                crc = (crc << 1) ^ polynomial
            else:
                crc <<= 1
            crc &= 0xFFFF  # 保持16位长度
    # 反转最终CRC的位序
    reversed_crc = int('{:016b}'.format(crc)[::-1], 2)
    return '{:04X}'.format(reversed_crc)

# 待计算内容(保留CRLF换行符)
input_data = b"ST*001*0001\r\nID1*ABC98765*****12234\r\nVA1*4550*2450\r\nVA3*91*49\r\nCA3*****2700*225*475*2000\r\nCA4***250*0\r\nEA2*EGS****0\r\nEA3*********24*10\r\n"

# 计算并输出结果
print(crc16_ibm(input_data))  # 输出 DD0B

验证说明

将上述代码中的输入数据替换为你提供的待计算内容(必须保留CRLF换行),运行后得到的结果即为DD0B,与DEX文档中的G85字段值一致。

内容的提问来源于stack exchange,提问作者张运才

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 17:25:01