简介
循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。
CRC参数模型
参数名称 | 参数意义 |
---|---|
Name | CRC校验的名称,存在许多用于特定场合的CRC校验模型,比如“CRC-16/MODBUS” |
Width | 代表生成项的长度 |
Poly | 多项式码 |
Init | CRC校验码的初始值吗,数据在进行上述二项式运算之前,需要先将要计算的数据与初始值进行异或,然后再与多项式进行计算,其作用是可以保留数据头部的初始零(如果与0xFFFF异或,则头部省略的零变成1进行运算) |
RefIn | 输入数据是否反转,通常与数据的接受方式有关,比如MODBUS是先接受低位数据,所以就需要对输入数据进行反转,可以在接收端“负负得正” |
XorOut | 最后的CRC校验码与XorOUt进行异或后再输出 |
RefOut | 输出的CRC校验码是否反转,一般于RefIn配对 |
- 不同的二项式、初始值、结果异或值、反转原则都会造成最终的结果不一致,所以存在许多模型参数不同的CRC校验,但是只要发送方和接收方约定相同,就可以成功校验。
- 出现数据反转的原因是由于一些协议传输数据是从低位开始的,比如:因为Modbus在传输数据的时候是低位优先的,也就是它是从0位出去的,然后接收端是从0位接收的。所以RefIn和RefOut一般是成对出现的。
多项式码
性质
- 生成多项式的最高位和最低位必须为1。
- 当被传送信息(CRC码)任何一位发生错误时,被生成多项式做模2除后,应该使余数不为0。
- 不同位发生错误时,应该使余数不同。
- 对余数继续做模2除,应使余数循环。
特点
- 多项式码的首位1可以忽略
* 因为在实现往往是检测数据的置1数据位,然后跳过,对剩下的取余。既跳过了数据的置1数据位,也跳过了多项式码的首位1.
实例
- x16 + x15 + x2 + 1对应的多项式码是1’0x8005(1000 0000 0000 0101B),其首位的1可以忽略,其反向校验的值为1’0xA001(1010 0000 0000 0001B)。
实现方式
从理解原理到实际实现,是有很多技巧可以使用的。(在Qt中实现)
- 直接计算法
unsigned short crc_check(QByteArray data) { <