- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
CRC32算法研究与程序实现
CRC32算法研究与程序实现
摘要:循环冗余校脸CRC(Cyclic Redundancy Check)是一种编码简单,且高效、可靠的差错控制方法,广泛应用于工业测控及数据通信领城。首先分析了CRC的校验原理、冗余位的产生方法、性能分析。然后以CRC-32为例,给出了软件实现算法的C语言代码。
关键词:差错控制;循环冗余校验(CRC);检错码
0 引言
检错(和纠错)技术的基本思想都是利用发送端发送的所有消息比特产生一个或多个用于检错(和纠错)的特殊比特(如图1所示)。
实现检错功能的差错控制方法很多,传统的有:奇偶校验、校验和检测、重复码校验、恒比码校验、行列冗余码校验等,这些方法都是增加数据的冗余量,将校验码和数据一起发送到接受端。接受端对接受到的数据进行相同校验,再将得到的校验码和接受到的校验码比较,如果二者一致则认为传输正确。
循环冗余校验CRC(Cyclic Redundancy Check)是由分组线性码的分支而来,其主要应用是二元码组。编码简单且误判概率很低,在通信系统中得到了广泛的应用。
1 CRC校验原理
CRC校验主要是利用线性编码理论,其基本原理如下:
在发送端,根据要传送的k位二进制码信息序列,以一定的规则产生一个校验用的r位监督码(即CRC码),并附在信息序列后边,构成一个新的(k+r)位二进制码序列,发送出去;在接收端,根据信息码和CRC码之间所遵循的规则进行校验,以确定传送中是否出错。
校验码R是通过对数据序列D进行二进制除法取余运算得到的,它被一个称为生成多项式的(r+1)位二进制序列G=[grgr-1…g1g0]来除,用多项式表示为
其中xrD(x)表示将数据序列D左移r位(即在D的末尾再增加r个位), Q(x)代表这一除法所得的商,R(x)就是所需的余式.这一运算关系还可以用下式来表示:
其中,Re[]表示对括号内的式子进行取余运算。
校验码的编码计算如上所述,而校验过程则是对M序列直接进行除法取余运算,即
所得到的余式R(x)若为0表示数据正确,否则认为发生错误。
2 CRC校验的检错性能
CRC校验码的检错能力与其生成多项式G(X)密切相关。G(X)的次数越高,其检错能力越强。若CRC校验的生成多项式G(X)的最高次幂为r,则该CRC校验码的检错性能如下:(1)可检出所有奇数个错误;(2)可检出所有2bit个错误;(3)可检出所有长度r+1个比特的突发错误,其漏检率仅为:1/2r;
CRC码具有良好的检错性能,因而在数据通信中得到广泛应用。
3 CRC-32的程序实现
编写CRC校验程序有2种办法:一种为计算法,计算法就是依据CRC校验码的产生原理来设计程序。其优点是模块代码少,修改灵活,可移植性好;其缺点为计算量大。另一种为查表法,查表法的优缺点与计算法的正好相反,可以大大降低CPU的运算时间。这种方法应用比较广泛。
下面是生成CRC-32校验码的子程序。参数表可以先在PC机上算出来,也可在程序初始化时完成。下面是用于计算参数表的c语言子程序,在Visual C++ 6.0下编译通过。
#include
unsigned long int crc32_table[256];
unsigned long int ulPolynomial = 0x04c11db7;
unsigned long int Reflect(unsigned long int ref, char ch)
{unsigned long int value(0); // 交换bit0和bit7,bit1和bit6,类推
for(int i = 1; i (ch + 1); i++)
{ if(ref 1)value |= 1 (ch - i);
ref = 1;
}
return value;
}
unsigned long crc_32_tab[256]={0 0 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,0x0edb8832,…, 0x5a05df1b, 0x2d02ef8d};//事先计算出的参数表,共有256项,未全部列出。
unsigned long GenerateCRC32(char xdata * DataBuf,unsigned longlen)
{unsig
文档评论(0)