Linux日常——CRC校验

CRC
即循环冗余校验码(Cyclic Redundancy Check[1] ):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。
循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
比特在传输过程中可能产生差错:1可能会变成0,0可能变成1,这叫比特差错。它是传输差错中的一种。
误码率:传输错误的比特占所传输比特总数的比率。
所以为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检验措施。
校验原理:
在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码。对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式P(x)。根据P(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。
任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。
校验码的具体生成过程为:
在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)得到的余数就是校验码。

下面是一个检验的具体实例:

CRC运算就是在数据M后添加供差错检验的n为冗余码
在数据端,将数据划分为组,假设每组K 个比特。现在传输数据M
M=101001 , K = 6
生成多项式假设为:P(X)=X^3+x^2+X^0
以下为n位冗余码的计算方法:

补多项式最高次幂个0:101001000
多项式生成除数P: 1101
X^3+x^2+0+X^0
1 1 0 1
二进制模2运算:
Linux日常——CRC校验_第1张图片
得到冗余码为:001
所以最后发送出的帧为:101001001
在接收端把收到的数据以帧为但单位进行CRC检验,把收到的每一个帧都除以同样的除数P(模2运算),然后检查得到的余数R。
R=0,传输中无差错,接受
R!=0,出现差错,丢弃

你可能感兴趣的:(linux)