我正在尝试在 python 中实现“VÖV 04.05.1”CRC 算法。这用于德国公共交通通信的数据电报。描述该算法的标准是付费专区并受版权保护的,因此我无法在这里发布原始文档,但这是一个摘要:
基本上,它使用 CRC-16 和以下生成多项式: G(x) = x^16 + x^14 + x^13 + x^11 + x^10 + x^9 + x^8 + x^6 + x^5 + x^1 + 1
结果位必须被反转。
目前我正在使用 python 的 crcmod 包来生成 CRC。多项式被翻译成十六进制的
0x16f63
(至少我是这么认为的)。这是我的代码:
import crcmod
#message from which the checksum is to be formed
msg = "00000000000000000000000010000000"
#crcmod parameters
crc16 = crcmod.mkCrcFun(0x16f63, rev=True, initCrc=0x0000, xorOut=0x0000)
#interpret string as binary, convert to bytes, calculate CRC
crc_result = crc16(int(msg, 2).to_bytes((len(msg) + 7) // 8, 'big'))
#print result in BIN and HEX
print(bin(crc_result))
print(hex(crc_result))
该标准包含两个 CRC 计算示例:
00000000000000000000000000000001
必须导致 CRC 为 0x4c7d
00000000000000000000000010000000
必须导致 CRC 为 0x909c
尽管摆弄了参数,我还是没有得到正确的结果。即使有反转位。我感谢任何帮助!
抱歉我听不懂。
“值是:0x16f63,rev=True,initCrc=0xFFFF,xorOut=0xFFFF。”所以代码是
import crcmod
#message from which the checksum is to be formed
#msg = "00000000000000000000000010000000"
msg = "00000000000000000000000000000001"
#crcmod parameters
crc16 = crcmod.mkCrcFun(0x16f63, rev=True, initCrc=0xFFFF, xorOut=0xFFFF)
#interpret string as binary, convert to bytes, calculate CRC
crc_result = crc16(int(msg, 2).to_bytes((len(msg) + 7) // 8, 'big'))
#print result in BIN and HEX
print(bin(crc_result))
print(hex(crc_result))
有了这个
msg = "00000000000000000000000010000000"
结果为 0x3909 而不是 0x909c
和
msg = "00000000000000000000000000000001"
结果为 0xbe32 而不是 0x4c7d
我在这里做错了什么?