CRC算法与实现

bearyy123

bearyy123

2016-01-29 12:15

CRC算法与实现,CRC算法与实现
CRC算法与实现
作者:bhw98

提交者:eastvc 发布日期:2004-1-2 20:57:13
原文出处:http://www.csdn.net/


摘要: 本文首先讨论了CRC的代数学算法,然后以常见的CRC-ITU为例,通过硬件电路的实现,引出了比特型算法,最后重点介绍了字节型快速查表算法,给出了相应的C语言实现。

关键词: CRC, FCS, 生成多项式, 检错重传

引言

CRC的全称为Cyclic Redundancy Check,中文名称为循环冗余校验。它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差错控制。实际上,除数据通信外,CRC在其它很多领域也是大有用武之地的。例如我们读软盘上的文件,以及解压一个ZIP文件时,偶尔会碰到“Bad CRC”错误,由此它在数据存储方面的应用可略见一斑。

差错控制理论是在代数理论基础上建立起来的。这里我们着眼于介绍CRC的算法与实现,对原理只能捎带说明一下。若需要进一步了解线性码、分组码、循环码、纠错编码等方面的原理,可以阅读有关资料。

利用CRC进行检错的过程可简单描述为:在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的r位监督码(CRC码),附在原始信息后边,构成一个新的二进制码序列数共k+r位,然后发送出去。在接收端,根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。这个规则,在差错控制理论中称为“生成多项式”。


1 代数学的一般性算法

在代数编码理论中,将一个码组表示为一个多项式,码组中各码元当作多项式的系数。例如 1100101 表示为
1·x6+1·x5+0·x4+0·x3+1·x2+0·x+1,即 x6+x5+x2+1。

设编码前的原始信息多项式为P(x),P(x)的最高幂次加1等于k;生成多项式为G(x),G(x)的最高幂次等于r;CRC多项式为R(x);编码后的带CRC的信息多项式为T(x)。

发送方编码方法:将P(x)乘以xr(即对应的二进制码序列左移r位),再除以G(x),所得余式即为R(x)。用公式表示为
T(x)=xrP(x)+R(x)

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/)

接收方解码方法:将T(x)除以G(x),如果余数为0,则说明传输中无错误发生,否则说明传输有误。

举例来说,设信息码为1100,生成多项式为1011,即P(x)=x3+x2,G(x)=x3+x+1,计算CRC的过程为

      xrP(x)     x3(x3+x2)     x6+x5                    x     -------- = ---------- = -------- = (x3+x2+x) + --------       G(x)       x3+x+1      x3+x+1                 x3+x+1

即 R(x)=x。注意到G(x)最高幂次r=3,得出CRC为010。

如果用竖式除法,计算过程为

               1110            -------         1011 /1100000     (1100左移3位)            1011            ----             1110             1011             -----              1010              1011              -----               0010               0000               ----                010

因此,T(x)=(x6+x5)+(x)=x6+x5+x, 即 1100000+010=1100010

如果传输无误,

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/)
       T(x)     x6+x5+x      ------ = --------- = x3+x2+x,       G(x)     x3+x+1

无余式。回头看一下上面的竖式除法,如果被除数是1100010,显然在商第三个1时,就能除尽。

上述推算过程,有助于我们理解CRC的概念。但直接编程来实现上面的算法,不仅繁琐,效率也不高。实际上在工程中不会直接这样去计算和验证CRC。

下表中列出了一些见于标准的CRC资料:

 名称  生成多项式  简记式*  应用举例  CRC-4  x4+x+1    ITU G.704  CRC-12  x12+x11+x3+x+1      CRC-16  x16+x12+x2+1  1005  IBM SDLC  CRC-ITU**  x16+x12+x5+1  1021  ISO
展开更多 50%)
分享

猜你喜欢

CRC算法与实现

C语言教程 C语言函数
CRC算法与实现

CRC算法的实现

编程语言 网络编程
CRC算法的实现

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

【算法】扑克发牌算法实现

Web开发
【算法】扑克发牌算法实现

用java实现RSA算法

编程语言 网络编程
用java实现RSA算法

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

利用SDK实现迷宫算法

C语言教程 C语言函数
利用SDK实现迷宫算法

CRC32生成码表方法实现

编程语言 网络编程
CRC32生成码表方法实现

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

JSP连接mysql数据库攻略

JSP连接mysql数据库攻略

递归的应用 -- 最简单分形图形实现

递归的应用 -- 最简单分形图形实现
下拉加载更多内容 ↓