计算CRC
我需要计算一个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'