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

Python中将ASCII十六进制转为真实十六进制并计算Modbus CRC16问题求助

解决Modbus CRC16计算错误问题

你遇到的核心问题是直接对十六进制字符串的ASCII字符计算CRC,而非将字符串解析为对应的二进制字节流,这才导致CRC结果错误。以下是正确的处理流程:

1. 把十六进制字符串转成真实字节流

用Python内置的bytes.fromhex()方法,能直接将十六进制字符串转换成对应的二进制字节对象,这是关键一步:

hex_str = "FE0300010000"
# 转换后得到真实的字节数据:b'\xfe\x03\x00\x01\x00\x00'
data_bytes = bytes.fromhex(hex_str)

2. 实现标准Modbus CRC16计算函数

Modbus CRC16采用多项式0xA001、初始值0xFFFF,并且最终结果是小端字节序(低字节在前),函数实现如下:

def calculate_modbus_crc16(data):
    crc = 0xFFFF
    for byte in data:
        crc ^= byte
        for _ in range(8):
            # 检查最低位是否为1
            if crc & 0x0001:
                crc = (crc >> 1) ^ 0xA001
            else:
                crc >>= 1
    # 按小端格式返回两位十六进制字符串(补前导零)
    return f"{crc & 0xFF:02X}{(crc >> 8):02X}"

3. 计算CRC并拼接最终十六进制字符串

把转换后的字节流传入函数计算,再拼接回原十六进制字符串:

crc_code = calculate_modbus_crc16(data_bytes)
full_hex_data = hex_str + crc_code
print(full_hex_data)  # 输出:FE03000100000500

你之前尝试的转换方向可能搞反了:binascii.hexlify是把字节转成十六进制字符串,而你需要的是把十六进制字符串转成字节,bytes.fromhex()就是干这个的,一步到位。

内容的提问来源于stack exchange,提问作者Seçkin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 01:50:34