计算CRC

0 投票
1 回答
5019 浏览
提问于 2025-04-18 15:38

我需要计算一个CRC(循环冗余校验),这样才能和一台机器进行通信。我对计算CRC还不太熟悉,所以如果这个问题之前有人问过,我很抱歉,因为我不太确定自己在找什么。总之,我需要在Python中计算一个CCIT 16位的CRC。我的消息是一个二进制流,看起来像这样:

b'G18M1314D4417,2511165'

这个消息是以STX(开始标志)开头,以ETX(结束标志)结尾。我尝试使用这个Python模块:

import crc16
print(crc16.crc16xmodem(b'G18M1314D4417,2511165'))

但是返回的结果是:

61154

而正确的CRC应该是:

A855

我到底漏掉了什么呢?

补充说明:我使用的是Python 3.3。我从机器发送的消息中得到了“正确”的CRC。我不确定STX和ETX字符是否应该包含在内,因为我之前从未接触过CRC。

1 个回答

2

我觉得你的机器正在使用一种叫做CRC-16/MCRF4XX的参数化CRC算法。

你可以使用crcmod这个模块,它可以通过pip来安装。你可以用预定义的算法crc-16-mcrf4xx来计算CRC。在计算CRC的时候,STX和ETX也应该被包含在内。

import crcmod
import crcmod.predfined

STX = b'\x02'
ETX = b'\x03'
data = b'G18M1314D4417,2511165'
message = STX + data + ETX

crc16 = crcmod.predefined.Crc('crc-16-mcrf4xx')
crc16.update(message)
crc = crc16.hexdigest()

>>> crc
'A855'

撰写回答