基本概念
CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
在网络通信中很多的帧或数据包中都采用CRC校验,其实CRC校验非常简单,我们通过这篇博客可以让你非常容易的学会。
工作原理
循环冗余校验码(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)*2R),这样C(x)的右边就会空出R位,这就是校验码的位置。用 C(x)*2R 除以生成多项式G(x)得到的余数就是校验码。
任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。例如:代码1010111对应的多项式为x^6+x^4+x^2+x+1,而多项式为x^5+x^3+x^2+x+1对应的代码101111。
举例说明
在网络中的发送端,先把数据划分为为组,假定每组k个比特。现假定待发送的数据M=101001(k=6).CRC运算就是在数据M的后面添加供差错检测用的n位冗余码,然后构成一个帧发送出去,一共发送(k+n)位。
现有生成多项式P(x)=x^3+x^2+x。->对应的代码为:1101。(4位)
其次,我们要在M后面加n个0,n比P少一位,此时应该在M后面加3个0。
我们想要的冗余码=(M+3个0)/P—->得到的余数,即为所求冗余码。
我们最后要发送的CRC校验数据位M+余数
注意:其中做出发时实际上是模2运算,简单理解就是运算时不借位,不进位。
计算
最后发送的数据为M+余数—> 101001001
接收检测
接收端也要进行CRC校验:把收到的数据都除以相同的除数( P),然后检查得到的余数R,如果在传输过程中无差错,那么经过CRC校验后得出的余数R肯定是0。若R不为0,那么传输过程中肯定出现了差错。