使用 crcmod 在 Python 中实现特殊的 CRC 算法

问题描述 投票:0回答:1

我正在尝试在 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 计算示例:

  1. 00000000000000000000000000000001
    必须导致 CRC 为
    0x4c7d
  2. 00000000000000000000000010000000
    必须导致 CRC 为
    0x909c

尽管摆弄了参数,我还是没有得到正确的结果。即使有反转位。我感谢任何帮助!

python crc
1个回答
0
投票

抱歉我听不懂。

“值是: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

我在这里做错了什么?

© www.soinside.com 2019 - 2024. All rights reserved.