CRC校验

时间:2024-03-30 11:38:49

一,什么是crc校验?
crc校验全称为:循环冗余校验码(Cyclic Redundancy Check),它是用来校验数据在传输过程中是否发生改变的。其原理为:在一个p位二进制数据序列之后附加一个r位二进制检验码(序列),从而构成一个总长为n=p+r位的二进制序列;附加在数据序列之后的这个检验码与数据序列的内容之间存在着某种特定的关系。如果因干扰等原因使数据序列中的某一位或某些位发生错误,这种特定关系就会被破坏。因此,通过检查这一关系,就可以实现对数据正确性的检验。
二,如何进行校验?
首先我们来学习几个概念:
1,帧检验序列FCS(Frame Check Sequence)
主要功能:为了校验数据是否正常而多加入了几位数据。
2,模二除
所谓的模二除,就是指不带借位的除法,具体请看下面的例子:

CRC校验

如图所示便为模二除,它与普通除法的区别便是不借位,即满足下面的运算规则:
(1)0-1=1
(2)0-0=0
(3)1-0=1
(4)1-1=0
3,生成多项式(generator polynomial)
当进行CRC检验时,发送方与接收方需要事先约定一个除数,而该除数使用生成多项式产生,一般记作G(x)。请看常见的生成多项式:
G(X) = X^4 + X^3 + 1
G(X)=X^8+X^5+X^4+1
G(X)=X^16+X^15+X^5+1
G(X)=X^12+X^11+X^3+X^2+1
……
生成除数的位数为生成多项式最高次数加1,相应的位数如果在相应的多项式中的相应次方是存在的则为1,否则用0代替。
如: G(X) = X^4 + X^3 + 1 (位数从0开始算起)
则它的代表的除数有5位(0~4),x^4,x^3,1(x^0)存在,所以相应的位数为1,其余位为0,即为:
11001
G(X)=X^8+X^5+X^4+1
除数为:100110001
G(X)=X^16+X^15+X^5+1
除数为:11000000000100001
G(X)=X^12+X^11+X^3+X^2+1
除数为:1100000001101
三,校验码的生成
如果生成的除数为m(m>1)位,则最后的校验码就为m-1位 。
如下所示:
若需要传输的数据为:1101001001
生成多项式选择:G(x)=X^4 + X^3 + 1
则除数为:11001
开始生成:
1,首先在传输的数据后加上4个0(最后生成的校验码为除数位数减1),即为:11010010010000
2,以11010010010000为被除数,以11001为除数进行模二除,直到最后一位除不过为止
3,过程
CRC校验
4,经过计算可以得到需要的校验码为:1001
5,将原始数据后面的四个0修改为校验码即得:11010010011001

四,如何校检数据呢?
当接收方收到发送的数据后,便用该数据除以双方约定的除数,如果能够整除便说明数据无误,如果不为0则传输过程出现了错误
校检结果如下:
CRC校验
由于我们直接使用了对的数据所以得到的余数为0,可如果将数据中的某一位,或某些位进行取反,结果又会怎样呢?有兴趣的童鞋可以进行尝试一番,此处便不再赘言。