最近项目中用到了跟硬件通信的crc8校验,花了点时间研究了一下python的crc8校验,但是一直没有找到好的技术突破。
google了一番,昨天测试了网上的几种方法都不正确,确定了使用crcmod库来实现,参考官方文档和国内的一遍文章,具体如下:
http://crcmod.sourceforge.net/crcmod.predefined.html#class-predefinedcrc
http://blog.csdn.net/snoop_lttx/article/details/53674657
其实python3 只需要3步即可实现crc8校验,官方有crc8,但是默认是crc-8不是我要找的crc-8-maxim,而crcmod库是支持多种crc8计算的。
![](https://img.haomeiwen.com/i3015720/709a973cb43dcbb2.png)
下面我是采用crc-8-maxim算法的,多项式:x8+x5+x4+1(二进制为100110001),0x31
两种方法实现--3步计算crc8校验和
import crcmod.predefined
crc8 = crcmod.predefined.Crc('crc-8-maxim')
crc8.update(bytes().fromhex('011200'))
print(hex(crc8.crcValue))
#方法二
crc8_func = crcmod.predefined.mkCrcFun('crc-8-maxim')
crc8_func_value = crc8_func(bytes().fromhex('011200'))
print(hex(crc8_func_value))
正确运行结果为:0xd6
![](https://img.haomeiwen.com/i3015720/fd4bcf349186b6e5.png)
验证crc8校验和
下面我们使用在线crc校验工具测试一下:
http://www.ip33.com/crc.html
测试截图如下:
![](https://img.haomeiwen.com/i3015720/5694744a663a93e3.png)
到此我们完成了crc8校验和。
技巧总结
其中我们用到了一个很关键的一步转换-16进制字符串转16进制字节
目前有三种方式实现转换:
# 第一种
bytes().fromhex('011200')
# 第二种 需要import binascii
binascii.a2b_hex(('011200')
# 第三种 需要import binascii
binascii.unhexlify(('011200')
关于crc8的理论,本文不再赘述了。可以参考以下文章:
http://blog.csdn.net/haifengid/article/details/51753181
网友评论