什么是CRC校验?
CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
CRC校验原理:
其根本思想就是现在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)。到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。如果有余数,则表明该帧在传输过程中出现了差错。
CRC校验步骤:
CRC校验中有两个关键点:
一:是预先确定一个发送端和接收端都用来作为除数的二进制比特串(或多项式),可以随机选择,也可以使用国际标准,但是最高位和最低位必须是1;
二:是把原始帧与上面计算出的除数进行模2除法运算,计算出CRC码。
具体步骤:
1.选择合适的除数
2.看选定除数的二进制位数,然后再要发送的数据帧上面加上这个位数-1位的0,然后用新生成的帧以模2除法的方式除上面的除数,得到的余数就是该帧的CRC校验码。注意,余数的位数一定只比除数位数少一位,也就是CRC校验码位数比除数位数少一位,如果前面位是0也不能省略。
3.将计算出来的CRC校验码附加在原数据帧后面,构建成一个新的数据帧进行发送;最后接收端以模2除法方式除以前面选择的余数,如果没有余数,则说明数据帧在传输过程中没有出错。
例:CRC生成多项式(选择的除数):G(x) = x^4+ x^3+1, 要求出二进制序列10110011(原始帧)的CRC校验码。
1.除数的二进制序列11001
2.除数是5位,则在数据帧后面加5-1位0,则数据帧变为101100110000,然后使用模2除法除以除数11001,得到余数。【补几位0与x的最高次幂相同,模除就是进行异或】
3.将计算出来的CRC校验码添加到原始帧的后面,真正的数据帧为101100110100,再把这个数据帧发送到接收端。
4.接收端收到数据帧后,用上面选定的除数,用模2除法除去,验证余数是否为0,如果为0,则说明数据帧没有出错。
生成多项式G(X):除数,多项式的位宽(Width,简记为W),这个位宽不是多项式对应的二进制数的位数,而是位数减1.
另外一点,多项式表示和二进制表示都很繁琐,交流起来不方便,因此,文献中多用16进制简写法来表示,因为生成多项式的最高位肯定为1,最高位的位置由位宽可知,故在简记式中,将最高的1统一去掉了,如CRC32的生成多项式简记为04C11DB7实际上表示的是104C11DB7。当然,这样简记除了方便外,在编程计算时也有它的用处。所以在第一章中提到的在被除数后增加0的位数就是位宽,计算出的CRC校验值长度也是位宽。
信息/数据 多项式C(x):原始帧多项式
C(x)左移R位:C(x)*2^R
校验码:C(x)*2^R 除以 G(X) 所得的余数