没有合适的资源?快使用搜索试试~ 我知道了~
循环冗余校验(CRC)算法入门引导.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 4 浏览量
2023-03-29
20:18:26
上传
评论
收藏 518KB PDF 举报
温馨提示
试读
11页
。
资源推荐
资源详情
资源评论
写给嵌入式程序员的循环冗余校验
(CRC)算法入门引导
前言
CRC 校验(循环冗余校验)是数据通讯中最常采用的校验方式。在嵌入式软件开发中,经
常要用到 CRC 算法对各种数据进行校验。因此,掌握基本的 CRC 算法应是嵌入式程序员
的基本技能。可是,我认识的嵌入式程序员中能真正掌握CRC 算法的人却很少,平常在项
目中见到的 CRC 的代码多数都是那种效率非常低下的实现方式。
其实,在网上有一篇介绍 CRC 算法的非常好的文章,作者是 Ross Williams,题目叫:“A
PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS”。我常将这篇文章推荐
给向我询问 CRC 算法的朋友,但不少朋友向我抱怨原文太长了,而且是英文的。希望我能
写篇短点的文章,因此就有了本文。不过,我的水平比不了 Ross Williams,我的文章肯定
也没 Ross Williams 的写的好。因此,阅读英文没有障碍的朋友还是去读 Ross Williams 的
原文吧。
本文的读者群设定为软件开发人员,尤其是从事嵌入式软件开发的程序员,而不是专业从事
数学或通讯领域研究的学者(我也没有这个水平写的这么高深)。因此,本文的目标是介绍
CRC 算法的基本原理和实现方式,用到的数学尽量控制在高中生可以理解的深度。
另外,鉴于大多数嵌入式程序员都是半路出家转行过来的,不少人只会C 语言。因此,文
中的示例代码全部采用 C 语言来实现。作为一篇入门短文,文中给出的代码更注重于示范
性,尽可能的保持易读性。因此,文中的代码并不追求最高效的实现,但对于一般的应用却
也足够快速了。
从奇偶校验说起
所谓通讯过程的校验是指在通讯数据后加上一些附加信息,通过这些附加信息来判断接收到
的数据是否和发送出的数据相同。比如说 RS232 串行通讯可以设置奇偶校验位,所谓奇偶
校验就是在发送的每一个字节后都加上一位,使得每个字节中 1 的个数为奇数个或偶数个。
比如我们要发送的字节是 0x1a,二进制表示为 0001 1010。
采用奇校验,则在数据后补上个 0,数据变为 0001 1010 0,数据中 1 的个数为奇数个(3
个)
采用奇校验,则在数据后补上个 1,数据变为 0001 1010 1,数据中 1 的个数为偶数个(4
个)
接收方通过计算数据中 1 个数是否满足奇偶性来确定数据是否有错。
奇偶校验的缺点也很明显,首先,它对错误的检测概率大约只有 50%。也就是只有一半的
错误它能够检测出来。另外,每传输一个字节都要附加一位校验位,对传输效率的影响很大。
因此,在高速数据通讯中很少采用奇偶校验。奇偶校验优点也很明显,它很简单,因此可以
用硬件来实现,这样可以减少软件的负担。因此,奇偶校验也被广泛的应用着。
奇偶校验就先介绍到这来,之所以从奇偶校验说起,是因为这种校验方式最简单,而且后面
将会知道奇偶校验其实就是 CRC 校验的一种(CRC-1)。
累加和校验
另一种常见的校验方式是累加和校验。所谓累加和校验实现方式有很多种,最常用的一种是
在一次通讯数据包的最后加入一个字节的校验数据。这个字节内容为前面数据包中全部数据
的忽略进位的按字节累加和。比如下面的例子:
我们要传输的信息为: 6、23、4
加上校验和后的数据包:6、23、4、33
这里 33 为前三个字节的校验和。接收方收到全部数据后对前三个数据进行同样的累加计
算,如果累加和与最后一个字节相同的话就认为传输的数据没有错误。
累加和校验由于实现起来非常简单,也被广泛的采用。但是这种校验方式的检错能力也比较
一般,对于单字节的校验和大概有 1/256 的概率将原本是错误的通讯数据误判为正确数据。
之所以这里介绍这种校验,是因为 CRC 校验在传输数据的形式上与累加和校验是相同的,
都可以表示为:通讯数据校验字节(也可能是多个字节)
初识 CRC 算法
CRC 算法的基本思想是将传输的数据当做一个位数很长的数。将这个数除以另一个数。得
到的余数作为校验数据附加到原数据后面。还以上面例子中的数据为例:
6、23、4 可以看做一个 2 进制数: 0000011000010111 00000010
假如被除数选 9,二进制表示为:1001
则除法运算可以表示为:
可以看到,最后的余数为 1。如果我们将这个余数作为校验和的话,传输的数据则是:6、
23、4、1
CRC 算法和这个过程有点类似,不过采用的不是上面例子中的通常的这种除法。在CRC
算法中,将二进制数据流作为多项式的系数,然后进行的是多项式的乘除法。还是举个例子
吧。
比如说我们有两个二进制数,分别为:1101 和 1011。
1101 与如下的多项式相联系:1x
3
+1x
2
+0x
1
+1x
0
=x
3
+x
2
+x
0
1011 与如下的多项式相联系:1x
3
+0x
2
+1x
1
+1x
0
=x
3
+x
1
+x
0
两个多项式的乘法:(x
3
+x
2
+x
0
)(x
3
+x
1
+x
0
)=x
6
+x
5
+x
4
+x
3
+x
3
+x
3
+x
2
+x
1
+x
0
得到结果后,合并同类项时采用模 2 运算。也就是说乘除法采用正常的多项式乘除法,而
加减法都采用模 2 运算。所谓模 2 运算就是结果除以 2 后取余数。比如 3 mod 2 = 1。因此,
上面最终得到的多项式为:x
6
+x
5
+x
4
+x
3
+x
2
+x
1
+x
0
,对应的二进制数:111111
加减法采用模 2 运算后其实就成了一种运算了,就是我们通常所说的异或运算:
0+0=0 0-0=0
剩余10页未读,继续阅读
资源评论
若♡
- 粉丝: 6123
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功