[转载]CRC校验

来源:互联网 发布:遗传算法的实现 编辑:程序博客网 时间:2024/05/19 11:48

转载
今天看到了这篇非常简洁又非常实用的关于CRC校验的文章,分享给大家,原博主也是非常厉害的大牛:
http://blog.csdn.net/snow_5288/article/details/73472398

一、循环冗余校验的作用

在网络传输过程中,我们可能会遇到或多或少的差错,所谓差错,是指接收端收到的数据和发送端实际发送的数据出现不一致的现象,凡是出现差错的地方,我们都应对其进行差错控制。

差错控制的作用与机制:
差错控制是采用可靠、有效的编码以减少或消除计算机通信系统中传输差错的方法,其目的在于提高传输质量。主要作用是通过发现数据传输过程中的错误,采取相应的措施减少数据传输错误。差错控制的核心是对传输的数据信息加上与其满足一定关系的冗余码,形成一个加强的、符合一定规律的发送序列,所加入的冗余码称为校验码(Frame Check Sequence,FCS)。

校验码按照功能的不同被分为纠错码和检错码。顾名思义,纠错码不仅能发现传输中的错误,还能利用其纠错码中的信息自动纠正错误,其对应的差错控制措施为自动前向纠错(如汉明码即为典型的纠错码)。检错码只能用来发现传输中的错误,但不能自动纠正所发现的错误,需要通过反馈重发来纠错。常见的检错码有奇偶校验码和循环冗余校验码。

二、循环冗余校验码(CRC)

1、CRC校验的基本组成
循环冗余校验码(Cycle Redundancy Check,CRC)是一种被广泛采用的多项式编码,又称多项式码。

CRC码由两部分组成,前一部分是k+1个比特的待发送信息(固定不变),后一部分是r个比特的冗余码。
计算过程中主要用到两个多项式:f(x) 和 G(x)。
f(x) 是一个k阶多项式,其系数是待发送的k+1个比特序列;
G(x) 是一个r阶的生成多项式,由发收双方预先约定。

2、CRC校验举例
设实际要发送的信息序列为1010001101(10个比特,k = 9),则以它们作为f(x) 的系数,得到对应的9阶多项式为:

f(x)= 1*x^9 + 0*x^8 + 1*x^7 + 0*x^6 + 0*x^5 + 0*x^4 +
1*x^3 + 1*x^2 + 0*x + 1
1
2
再假设发收双方预先预订了一个5阶(r = 5)的生成多项式:

G(x) = x^5 +x^4 +x^2 + 1
= 1*x^5 + 1*x^4 + 0*x^3 + 1*x^2 + 0*x + 1
1
2
则其系数序列为110101。

CRC码的产生方法如下:
1>生成 r 个比特的冗余码:用模2除法进行 x^r f(x) / G(X) 运算,得余数R(x) ,其系数即是冗余码。
这里写图片描述
其中的余数01110即为冗余码,对应的余式:

R(x) = x^4 + x^3 + x^2 + x + 0
1
注意:模2除法在做减法时不借位,相当于在进行异或运算。

2>得到带CRC校验的发送序列:用模2减法进行 x^5 f(x) - R(x) 运算得到带CRC校验的发送序列,即x^5 f(x) - R(x) = 101000110101110。形式上看,就是在原信息序列后面附加上冗余码。

在接收方,用同样的生成多项式G(x) 除所收到的序列。若余数为0,则表示传输无差错,否则说明传输过程出现差错。若收到的序列是101000110101110,用它除以G(x) = x^5 +x^4 +x^2 + 1(即110101),因为余数为0,所以收到的序列无差错。

3>常见的标准生成多项式:

CRC-12:G(x) = x^12 + x^11 + x^3 + x^2 + 1
CRC-16:G(x) = x^16 + x^15 + x^2 + 1
CRC-12:G(x) = x^32 + x^26 + x^23 + x^22 + x^16 + x^12 +
x^11 + x^10 + x^8 + x^7 + x^5 + x^4 +
x^2 + x + 1
1
2
3
4
5
从中可以看出,只要选择足够的冗余位,就可以使得漏检率减少到任意小的程度。CRC能够检测出下列错误:
1>全部的奇数个错
2>全部的二位错
3>全部长度小于或等于r(冗余码长度)位的突发错。

原创粉丝点击