解决了!谢谢rcgdlr。
我只是在学习CRC,不确定我的实现是否正确。我有很多问题:
bytes_trans = cmd_in [5:-2]#-2包括inc crc或-4到excl crc?
如何确定我的初始值?我在网上看到的大多数实现都使用0或通过了crc本身。我尝试了以下两种方法:
crc_start = int.from_bytes(cmd_in [-4:-2],byteorder ='little',signed = False)#消息中的CRC
crc = binascii.crc_hqx(bytes_trans,crc_start)
crc2 = binascii.crc_hqx(bytes_trans,0)
我怎么知道它什么时候起作用?我相信我要寻找的是0还是匹配CRC的整数?
到目前为止,我还没有获得成功,这表明我使用了错误的输入,或者CRC实际上不是我正在使用的文档中指定的CCITT CRC-16。我已经尝试了大多数PyCRC实现,例如DNP和Kermit也没有运气。有没有办法确认我确实在使用CCITT CRC-16?是否有可能会因实施方式有所不同而使CCITT CRC-16稍加修改?
答案 0 :(得分:0)
通常在数据后附加CRC,最高有效字节在前。
初始值取决于特定的实现。对于16位CRC,两个最常见的值为0x0000或0xffff。在某些情况下,将使用其他值,其中最常见的值将等于初始值0x0000,并以两个字节数据串0xff,0xff的CRC值生成,就好像数据以两个字节模式0xff作为前缀,0xff。
要检查您的CRC实施情况,可以将其与以下网站中的CRC之一进行比较:
https://www.lammertbies.nl/comm/info/crc-calculation.html
使用十六进制输入选项更加灵活。比较实现时,在网站输入框中输入数据时,请勿将计算出的CRC附加到数据中。