CRC校验算法的分析及C语言实现.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
CRC校验算法的分析及C语言实现

信息学院 现代通信网概论 期末论文 课 题: CRC校验算法的分析及C语言实现 姓 名: 文斌 指导老师: 周翔 院 系: 信息学院 通信工程专业 班 级: 通信一班 学 号: xx 摘要:在通信网络系统中,为了保证在数据链路层建立可靠、清晰的链接,可以加入一些冗余数据以便于检测错误,从而重传数据帧. 循环冗余校验(CRC) 就是一种被广泛采用的错误检验编码,本文详细分析了CRC 校验算法及用C语言实现. 关键词: 循环冗余校验(CRC) ; 生成多项式; CRC算法的C语言代码 CRC 校验原理 在代数编码理论中,为了便于计算, 把码组中各码元当作一个多项式的系数, 即长为n 的码组( an - 1an - 2 ?a1 a0) 可表示成T ( x ) = an - 1 x n - 1 + an - 2 x n - 2 + ?+ a1 x + a0 . CRC 校验正是利用码多项式的模2运算,让被校验数据能为某一提前选定的生成多项式所除,如果能除尽,表明代码正确,如果除不尽,表明代码错误,余数则指明出错位所在位置. 因为任意一组仅由信息位组成的码,很可能除不尽,所以在信息位后附加若干称为校验位的冗余位,可以保证由信息位和冗余位组成的码组能被生成多项式整除,CRC 校验中,生成多项式的选取决定了校验位的宽度以及编码的检纠错能力,通信系统中常用的生成多项式为: CRC - 16/ ARC   G(X) - 1 ,8005H CRC - 16/ CITT   G(X) - 1 ,1021H CRC - 32/ ADCCP  G(X) - 1 ,04C11DB7H 《二》CRC校验算法公式 三 编码方法 设生成多项式g ( x) 为r 次,信息码多项式为m ( x) ,编码步骤如下: (1) 用x r 乘m ( x) ,即在信息位后附加r 个“0”. (2) g ( x ) 除以x rm ( x ) ,得到商式Q ( x) 和余式r ( x) ,即          x rm ( x )/g ( x ) = Q ( x) + r ( x)/g ( x) .(3) 输出码多项式为T ( x ) = x rm ( x) + r ( x) . 四  解码方法 将收到的编码用生成多项式去除,若码字无误则余数为0. 否则,余数不为0 ,通过查表可以确定出错位.CRC 校验可用于检错、纠错或检纠错,但不论用途如何,如果校验和(余数) 求出,只需简单的判断便可 进行检错或纠错. 因此,本文重点讨论对于任意码多项式的余数的算方法及实现. 五 用C 语言程序实现方法 下面以最常用的CRC-16 为例来说明其生成过程。假设发送信息用信息多项式K(X)表示,将K(x)左移R 位,则可表示成k(x)*2R,这样K(x)的右边就会空出R 位,这就是校验码的位置。通过k(x)*2R 除以生成多项式G(x)得到的余数就是校验码。实现方法: 1) 最高幂次为R 的生成多项式G(x)转换成对应的R+1 位二进制数。 2) 码左移R 位,相当与对应的信息多项式k(x)*2R。 3) 多项式(二进制数)对信息码做模2 除,得到R 位的余数。 4) 拼到信息码左移后空出的位置,得到完整的CRC 码。 C 语语言程序源代码: #includestdio.h void main() {unsigned int g,k,r,l,n,b,c,d,e,p,i,s,j,cont; register s1; printf(以下数据一十六进制计数方式输入\n); printf(请输入生成码的值:\n); scanf(%d,g); printf(请输入信息码的值:\n); scanf(%d,k); {unsigned int m,w=0; /* 测量生成码的长度r*/ m=g; do {m=1;w++;} while (m!=0); r=w;} {unsigned int m,w=0; /* 测量信息码的长度n*/ m=k; do {m=1;w++;} while (m!=0); n=w;} k=r-1; /* 信息码左移r-1 位,相当于

文档评论(0)

pangzilva + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档