CRC校验

来源:互联网 发布:360人工智能研究院招聘 编辑:程序博客网 时间:2024/06/06 07:43

一、CRC是什么?

数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定

简单来说,发送方用原始数据除以一个数,得到余数,然后把原始数据和余数拼凑在一起,发送出去.
接收方拿到数据后也截取出原始数据,除以同样一个数,得到余数,然后比较这个余数是不是与数据里带的余数一致,一致的话则传送没错误,不一致则传送出错.

原理在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码。对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。 校验码的具体生成过程为:假设发送信息用信息多项式C(X)表示,将C(x)左移R位,则可表示成C(x)*2的R次方,这样C(x)的右边就会空出R位,这就是校验码的位置。通过C(x)*2的R次方除以生成多项式G(x)得到的余数就是校验码。

 CRC校验原理看起来比较复杂,其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)。到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。如果有余数,则表明该帧在传输过程中出现了差错。

二、如何校验?

生成步骤


1、将X的最高次幂为R的生成多项式G(X)转换成对应的R+1位二进制数。

2、将信息码左移R位,相当于对应的信息多项式C(X)*X的R次方。

3、用生成多项式(二进制数)对信息码做除,得到R位的余数。
4、将余数拼到信息码左移后空出的位置,得到完整的CRC码。

例:

2的n次方乘M(发送数据),这相当于在 M 后面添加 n 个 0,长度成为k + n;得到的 (k + n) 位的数除以事先选定好的长度为(n + 1) 位的除数 P;除法采用的模2减法(无借位减,等价于异或);得出商是 Q 而余数是 R,余数 R 比除数 P 少1 位,即 R 是 n 位。
冗余码的计算举例
现在k = 6, M =101001。
设n= 3, 除数P= 1101,
被除数是 2的n次方*M= 101001000。
模 2 运算的结果是:商Q= 110101,余数R = 001。
把余数R 作为冗余码添加在数据M 的后面发送出去。
发送的数据是:2的n次方*M+ R
即:101001001,共(k + n) 位。