如何用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)}")
关键修正点
rev=False:VÖV CRC处理输入字节时,按高位到低位的顺序(标准MSB优先),不需要反转字节内的位序。- 手动反转16位结果:根据规范,计算出原始CRC值后,需要将16位结果的每一位反转,得到最终的校验码。
- 输入字节转换逻辑保持不变:你的二进制字符串转大端字节的处理是正确的,符合报文的高位在前的格式。
运行上述代码后,两个测试用例将分别输出预期的0x4c7d和0x909c。
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

