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

如何用Python的crcmod实现VÖV 04.05.1 CRC算法?

解决VÖV 04.05.1 CRC-16的Python实现问题

你的问题出在对crcmod参数的理解和结果反转的时机上。VÖV 04.05.1的CRC-16要求输入按高位到低位处理(不反转字节内的位),计算完成后再整体反转16位结果,而你之前设置了rev=True,让crcmod反转了输入字节的位序,导致计算错误。

修正后的代码

import crcmod

def reverse_16bit(n):
    """反转16位整数的所有位"""
    return int(f"{n:016b}"[::-1], 2)

# 测试用例1:输入预期结果0x4c7d
msg1 = "00000000000000000000000000000001"
bytes1 = int(msg1, 2).to_bytes((len(msg1) + 7) // 8, 'big')

# 初始化CRC函数:多项式0x16F63,输入不反转,初始值0,输出无XOR
crc16_vov = crcmod.mkCrcFun(0x16F63, rev=False, initCrc=0x0000, xorOut=0x0000)

# 计算原始CRC并反转16位得到最终结果
crc_raw1 = crc16_vov(bytes1)
crc_result1 = reverse_16bit(crc_raw1)
print(f"测试用例1结果:BIN={bin(crc_result1)}, HEX={hex(crc_result1)}")

# 测试用例2:输入预期结果0x909c
msg2 = "00000000000000000000000010000000"
bytes2 = int(msg2, 2).to_bytes((len(msg2) + 7) // 8, 'big')
crc_raw2 = crc16_vov(bytes2)
crc_result2 = reverse_16bit(crc_raw2)
print(f"测试用例2结果:BIN={bin(crc_result2)}, HEX={hex(crc_result2)}")

关键修正点

  1. rev=False:VÖV CRC处理输入字节时,按高位到低位的顺序(标准MSB优先),不需要反转字节内的位序。
  2. 手动反转16位结果:根据规范,计算出原始CRC值后,需要将16位结果的每一位反转,得到最终的校验码。
  3. 输入字节转换逻辑保持不变:你的二进制字符串转大端字节的处理是正确的,符合报文的高位在前的格式。

运行上述代码后,两个测试用例将分别输出预期的0x4c7d和0x909c。

内容的提问来源于stack exchange,提问作者Alexander

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 11:07:32