循环冗余校验 CRC的算法分析和程序实现
循环冗余校验原理及程序

ENDIF;
IFdtemp(7)='1'THEN
dtemp(7DOWNTO2):=dtemp(7DOWNTO2)XORPOLYNOMIAL;
ENDIF;
IFdtemp(6)='1'THEN
dtemp(6DOWNTO1):=dtemp(6DOWNTO1)XORPOLYNOMIAL;
rdata_r <=X"000";
dfinish_r <='0';
error01_r <='0';
ELSIFhrecv='1'THEN
rdatacrc <=datacrci;
rdtemp :=datacrci(16DOWNTO5);
IFrdtemp(11)='1'THEN
rdtemp(11DOWNTO6):=rdtemp(11DOWNTO6)XORPOLYNOMIAL;
while(--len>=0)
{
ch=*crcbuf++;ch<<=8;
for(i=0;i<8;i++)
{
crc<<=1;
if((ch&0x8000)!=0)crc|=1;
if(crc>=gx)crc∧=gx;
ch<<=1;
}
}
return((crc==0)?0∶1)
}
以上CRC编码和校验函数结构良好,调用接口清晰,执行效率很高,且具有良好的可
hsend<=hsend_r;
datacrco<=datacrco_r;
CRC校验算法及C#程序实现

CRC校验算法及C#程序实现CRC校验可以运用于传输数据过程中的验证,发送端发送有效数据时,先根据有效数据和生成多项式(比如CCITT标准的多项式是X16+X12+X5+1)计算出CRC校验码,把CRC校验码加到有效数据后面一起发送;当接收数据时,取出前面有效数据部分,用同样生成多项式计算出CRC校验码,然后取出接收数据后面CRC校验码部分,对比两个校验码是否相同。
如果相同,认为接收到的数据与发送的数据是一致的,传输正确;如果不同,认为传输数据出错。
CRC(循环冗余校验)算法主要是一个计算除法的过程。
算法有两个输入值,第一个是输入的信号,这通常是一个很长的数据,作为被除数。
第二个是一个与具体的CRC算法相关的多项式,称为生成多项式,用作除数。
基本的计算过程是,两者作模2除法(本质上是对应位做异或运算),余数就是CRC校验码的结果。
I、基本算法(人工笔算):以CRC16-CCITT为例进行说明,它的生成多项式是X16+X12+X5+1,CRC校验码为16位,生成多项式17位。
假如数据流为4字节:BYTE[3]、BYTE[2]、BYTE[1]、BYTE[0];数据流左移16位,相当于扩大256×256倍,再除以生成多项式0x11021,做不借位的除法运算(相当于按位异或),所得的余数就是CRC校验码。
发送时的数据流为6字节:BYTE[3]、BYTE[2]、BYTE[1]、BYTE[0]、CRC[1]、CRC[0];II、计算机算法1(比特型算法):1)将扩大后的数据流(6字节)高16位(BYTE[3]、BYTE[2])放入一个长度为16的寄存器;2)如果寄存器的首位为1,将寄存器左移1位(寄存器的最低位从下一个字节获得),再与生成多项式的简记式异或;否则仅将寄存器左移1位(寄存器的最低位从下一个字节获得);3)重复第2步,直到数据流(6字节)全部移入寄存器;4)寄存器中的值则为CRC校验码CRC[1]、CRC[0]。
CRC算法原理及C语言实现

CRC算法原理及C语言实现CRC(Cyclic Redundancy Check)循环冗余校验算法是一种常用的错误检测算法,广泛应用于数据通信、存储等领域。
它通过对发送的数据进行多项式计算,得到一个校验值,然后将这个校验值附加到数据末尾,接收方再进行校验,通过比较接收到的校验值和重新计算的校验值来判断数据是否出现错误。
本文将介绍CRC算法的原理以及如何使用C语言实现。
一、CRC算法原理1.多项式表示CRC算法使用一个多项式来进行计算,这个多项式称为校验多项式(Generator Polynomial)。
在CRC算法中,校验多项式是一个二进制数,其中最高位为1,低位为0。
例如,CRC-32算法的校验多项式是0x04C11DB72.计算过程(1)初始化:将校验值设为一个固定的初始值,通常为全为0的二进制数。
(2)数据处理:逐位处理输入的数据,包括附加校验值的数据。
(3)除法运算:对每一位数据按位异或,然后进行除法运算,取余数。
(4)更新校验值:将余数与下一位数据进行异或运算,再将结果作为新的校验值。
(5)重复上述步骤,直到处理完所有的数据。
3.校验结果CRC算法的校验结果即为最后得到的校验值。
在进行校验时,接收方使用相同的校验多项式,对接收到的数据进行相同的操作,得到的校验值与发送方发送的校验值进行比较,如果相同,则说明数据未发生错误,否则则说明数据出现了错误。
二、C语言实现CRC算法下面是一个简单的C语言实现CRC算法的例子,以CRC-32算法为例:```c#include <stdio.h>//初始化校验值unsigned int crc32_inireturn 0xFFFFFFFF;//计算CRC值unsigned int i, j;for (i = 0; i < length; i++)crc = crc ^ data[i];for (j = 0; j < 8; j++)if ((crc & 1) != 0)crc = (crc >> 1) ^ CRC32_POLYNOMIAL;} elsecrc = crc >> 1;}}}return crc;int maiunsigned char data[] = "Hello, World!";unsigned int crc = crc32_init(;printf("CRC-32 value: %08X\n", crc ^ 0xFFFFFFFF);return 0;```以上就是CRC算法的原理及使用C语言实现的内容。
crc校验实例

crc校验实例本文介绍了CRC(循环冗余校验)校验算法及其实例。
CRC是一种在数据传输过程中常用的校验方式,其基于多项式计算,通过生成冗余的比特序列来实现数据完整性的验证。
CRC可以检测出数据在传输过程中是否发生了错误或篡改。
本文将以一个简单的实例来介绍CRC校验的实现过程。
1. CRC校验算法的基本原理在传输数据时,常常会发生数据出现差错或者被人恶意篡改的情况,一旦出现这种情况,就会使得接收方的结果出错、含义歧义、甚至数据完全失效。
而CRC在数据传输期间可以帮助检测出这种变化,从而确保数据的完整性和正确性。
CRC校验可以通过一个多项式来实现。
假设数据D以二进制形式传输,那么CRC校验就是生成一个比特序列,然后与D拼接在一起,形成了一个长的二进制序列S。
然后S被除以一个特定的多项式P,并令余数为R。
根据CRC算法的定义,如果数据D正确接收到,那么R应该等于0。
也就是说,如果接收到的数据D出现错误,那么P就无法整除S,余数R也不等于0。
这样,接收方就可以根据R的值来判断数据是否正确。
2. CRC校验的实现过程下面,我们将通过一个简单的例子来介绍CRC校验的具体实现步骤。
我们假设要发送的数据为1001011,设计的多项式为1011。
因此,接收方会接收到101101010,其中最后三位000是CRC校验码。
a. 将1011(多项式)左移三位,即得到1011000。
b. 在1001011的最后加入三个0,得到1001011000c. 将1001011000除以1011,得到商10001000,余数011。
d. 将余数011拼接到1001011后面,即得到了完整的传输数据1001011011,其中最后三位为CRC校验码011。
接收方收到1001011011后,对其进行同样的计算,如果得到的余数不为0,则说明数据出现了错误。
3. CRC校验的应用场景CRC校验常常用于网络传输数据的数据完整性验证。
例如,当一个文件在Internet上传输时,发送方将计算出文件的CRC值并将其附加到文件末尾。
CRC检验原理及程序实现

CRC检验原理及程序实现引言:循环冗余检验CRC(Cyclic Redundancy Check)的检错技术应用较为广泛,由于实际的通信线路并非是理想的,它不可能将误码率(在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率BER)下降到零。
因此,为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用检错措施。
目前在数据链路中广泛采用循环冗余检验CRC检测技术。
1、循环冗余检验CRC的原理利用CRC进行检错的过程可简单描述为:在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的n位监督码(CRC码),附在原始信息后边,构成一个新的二进制码序列数共k+n位,然后发送出去。
在接收端,根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。
这个规则,在差错控制理论中称为“生成多项式”。
代数学的一般性算法:在代数编码理论中,将一个码组表示为一个多项式,码组中各码元当作多项式的系数。
例如1100101 表示为1·x6+1·x5+0·x4+0·x3+1·x2+0·x+1,即x6+x5+x2+1。
设编码前的原始信息多项式为G(x),G(x)的最高幂次加1等于k;生成多项式为P(x),P(x)的最高幂次等于r;CRC多项式为R(x);编码后的带CRC的信息多项式为T(x)。
发送方编码方法:将G(x)乘以xr(即对应的二进制码序列左移r位),再除以P(x),所得余式即为R(x)。
用公式表示为T(x)=xrG(x)+R(x)接收方解码方法:将T(x)除以G(x),如果余数为0,则说明传输中无错误发生,否则说明传输有误。
2、循环冗余码的产生及正确性检验的例子举例来说,设信息码为101001,生成多项式为1101,即P(x)=x3+x2+1,G(x)=x5+x3+1,计算CRC的过程为xrP(x) 即左移三位101001000P(x) =x3+x2+1 即R(x)=1。
循环冗余校验CR C 的算法分析及其实现方法

CRC循环冗余校验CRC的算法分析及其实现方法摘要:循环冗余校验(Cyclic Redundancy Check)是一种编码简单,且高效、可靠的差错控制方法,广泛应用于测控及数据通信领域。
阐述用循环冗余校验码CRC进差错控制的原理、并介绍使用硬件和软件两种方式实现CRC码的方法。
关键词:循环冗余校验 CRC 软件实现查表法循环冗余校验(Cyclic Redundancy Check),简称循环码或CRC码,是一种高效、可靠的检错和纠错码。
由于检错能力强,误判概率很低,并且编、译码电路简单,因而在工业检测及数据通信领域应用甚广。
目前,循环码常用作检错码。
下面重点CRC的原理及其软件、硬件实现方法。
1、CRC校验的原理CRC码是一种线性,分组的系统码,通常前k位为信息码元,后r位为监督码元。
CRC校验的基本思想是利用线性编码理论,以一定的规则产生一个校验用的监督吗(即CRC码)r位,并附在信息后边,构成一个新的二进制码序数共n=k+r位,最后发送出去,其格式如图1所示。
在接收方,则根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。
图1 CRC格式的生成r位的CRC码产生的规则是先将要发送的二进制序数左移r位(即乘以2r)后,再除以一个生成多项式,最后所得到的余数就是CRC吗,如(1)式所示。
其中,B(X)表示k 位的二进制序列数,G(X)为生成多项式,Q(X)位伤多项式,R(X)是余数多项式(即CRC码)。
多项式X"B(X)/G(X)=Q(X)+R(X)/G(X) (1)把(1)式移项得X"B(X)-R(X)=Q(X)G(X) (2)由于模2的加法、减法运算等价,所以(2)式可表示为:X"B(X)+R(X)=Q(X)G(X)=T(X) (3)T(X)就是发送方要发送的数据及其CRC码,与图1所示的格式一致。
另外,T(X)正好能被G(X)整除。
由(3)式可知,如果接收方收到的信息T"(X)没有发生错误,与T(X)相同,则T"(X)同样能被生成多项式G(X)整除,即余数为0.若余数不为0,则表示在通信过程中发生了错误,接收方应要求发送方重发。
crc_calculatecrc8h2f 算法

crc_calculatecrc8h2f 算法CRC(循环冗余校验)是一种广泛应用于数据传输和存储的错误检测算法。
CRC_CalculateCRC8H2F算法是一种特定的CRC算法,它使用8位CRC多项式并采用特定的计算方法。
本篇文章将详细介绍CRC_CalculateCRC8H2F算法的原理、步骤和实现方法。
一、CRC算法原理CRC算法通过生成一个唯一的校验码来检测数据传输中可能存在的错误。
它首先将数据序列作为初始值进行迭代,然后根据一定的规则(多项式)逐步修改这个值。
最后,将修改后的值与多项式的异或结果作为校验码。
如果数据在传输过程中发生了错误,校验码将会发生变化,从而可以检测出错误。
1. 初始化:将8位CRC寄存器初始化为0,选择8位CRC多项式(例如,CRC-8H2F多项式)。
2. 循环迭代:对于数据序列中的每个字节,执行以下操作:a. 将CRC寄存器的值向左循环移位一位(最低位补零)。
b. 与当前字节进行异或操作。
c. 如果移位过程中发生了进位,则需要处理进位(如果有)。
3. 生成校验码:将CRC寄存器的值与8位CRC多项式的异或结果作为最终的校验码。
4. 结束:完成对整个数据序列的CRC计算。
1. 代码实现:可以使用编程语言(如C、C++、Python等)来实现CRC_CalculateCRC8H2F算法。
具体的实现方法包括初始化CRC寄存器、循环迭代字节的异或操作、处理进位以及生成校验码等。
2. 硬件实现:对于一些特定的应用场景,还可以使用硬件设备来实现CRC_CalculateCRC8H2F算法。
例如,在通信领域,可以使用专门的硬件芯片来实现CRC计算,以提高计算速度和准确性。
3. 库函数调用:许多编程语言提供了内置的CRC计算库函数,可以直接调用。
使用者只需要提供数据序列和多项式参数,即可得到计算结果。
四、应用场景CRC_CalculateCRC8H2F算法广泛应用于数据传输、存储、通信等领域。
crc校验原理及代码

crc校验原理及代码CRC(循环冗余校验)是一种错误检测技术,通过对数据进行计算和比较,来确定数据是否被改变或破坏。
它主要用于数据通信中,确保数据的完整性。
CRC校验的原理是通过生成多项式来计算发送数据的校验码,并将校验码附加到数据末尾,接收方通过再次计算校验码来验证数据的完整性。
CRC采用二进制多项式除法的方式实现。
以下是一种常见的CRC校验算法,称为CRC-32算法,它使用32位的校验码:```pythondef crc32(data):crc = 0xFFFFFFFFfor byte in data:crc ^= bytefor _ in range(8):if crc & 1:else:crc >>= 1crc ^= 0xFFFFFFFFreturn crc```利用以上的代码,可以计算给定数据的CRC-32校验码。
下面是代码的解释:1. `crc32`函数的输入参数是字符串类型的数据。
2. `crc`变量初始值为0xFFFFFFFF,是32位全1的二进制数。
3.循环遍历输入数据中的每个字节,并进行计算。
4. `crc ^= byte`将校验码与当前字节进行异或操作。
5.在每个字节的8位中,循环判断最低位是否为17.若最低位为0,则直接右移一个位置。
8.在全部字节处理完成后,将校验码与0xFFFFFFFF进行异或操作,得到最终的校验码。
CRC校验在数据通信中非常常见,特别是在网络传输和存储媒介上。
它可以帮助检测传输过程中发生的位错误,提高数据的可靠性和完整性。
需要注意的是,CRC校验是一种错误检测机制,而不是错误纠正机制。
它只能告诉我们数据是否出现错误,而无法纠正错误。
若数据被改变或破坏,则接收方可以要求重新发送数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
循环冗余校验 CRC 的算法分析和程序实现西南交通大学计算机与通信工程学院 刘东摘要 通信的目的是要把信息及时可靠地传送给对方,因此要求一个通信系统传输消息必须可靠与快速,在数字通信系统中可靠与快速往往是一对矛盾。
为了解决可靠性,通信系统都采用了差错控制。
本文详细介绍了循环冗余校验CRC (Cyclic Redundancy Check )的差错控制原理及其算法实现。
关键字 通信 循环冗余校验 CRC-32 CRC-16 CRC-4概述在数字通信系统中可靠与快速往往是一对矛盾。
若要求快速,则必然使得每个数据码元所占地时间缩短、波形变窄、能量减少,从而在受到干扰后产生错误地可能性增加,传送信息地可靠性下降。
若是要求可靠,则使得传送消息地速率变慢。
因此,如何合理地解决可靠性也速度这一对矛盾,是正确设计一个通信系统地关键问题之一。
为保证传输过程的正确性,需要对通信过程进行差错控制。
差错控制最常用的方法是自动请求重发方式(ARQ )、向前纠错方式(FEC )和混合纠错(HEC )。
在传输过程误码率比较低时,用FEC 方式比较理想。
在传输过程误码率较高时,采用FEC 容易出现“乱纠”现象。
HEC 方式则式ARQ 和FEC 的结合。
在许多数字通信中,广泛采用ARQ 方式,此时的差错控制只需要检错功能。
实现检错功能的差错控制方法很多,传统的有:奇偶校验、校验和检测、重复码校验、恒比码校验、行列冗余码校验等,这些方法都是增加数据的冗余量,将校验码和数据一起发送到接受端。
接受端对接受到的数据进行相同校验,再将得到的校验码和接受到的校验码比较,如果二者一致则认为传输正确。
但这些方法都有各自的缺点,误判的概率比较高。
循环冗余校验CRC (Cyclic Redundancy Check )是由分组线性码的分支而来,其主要应用是二元码组。
编码简单且误判概率很低,在通信系统中得到了广泛的应用。
下面重点介绍了CRC 校验的原理及其 算法实现。
一、循环冗余校验码(CRC )CRC 校验采用多项式编码方法。
被处理的数据块可以看作是一个n 阶的二进制多项式,由012211a x a x a x a x n n n ++⋅⋅⋅++----。
如一个8位二进制数10110101可以表示为:10101101234567+++++++x x x x x x x 。
多项式乘除法运算过程与普通代数多项式的乘除法相同。
多项式的加减法运算以2为模,加减时不进,错位,和逻辑异或运算一致。
采用CRC 校验时,发送方和接收方用同一个生成多项式g (x ),并且g (x )的首位和最后一位的系数必须为1。
CRC 的处理方法是:发送方以g (x )去除t (x ),得到余数作为CRC 校验码。
校验时,以计算的校正结果是否为0为据,判断数据帧是否出错。
CRC 校验可以100%地检测出所有奇数个随机错误和长度小于等于k (k 为g (x )的阶数)的突发错误。
所以CRC 的生成多项式的阶数越高,那么误判的概率就越小。
CCITT 建议:2048 kbit/s 的PCM 基群设备采用CRC-4方案,使用的CRC 校验码生成多项式g (x )=14++x x 。
采用16位CRC 校验,可以保证在1410 bit 码元中只含有一位未被检测出的错误]2[。
在IBM 的同步数据链路控制规程SDLC 的帧校验序列FCS 中,使用CRC-16,其生成多项式g (x )=1 21516+++x x x ;而在CCITT 推荐的高级数据链路控制规程HDLC 的帧校验序列FCS 中,使用CCITT-16,其生成多项式g (x )=1 51516+++x x x 。
CRC-32的生成多项式g (x )=1 245781011121622232632++++++++++++++x x x x x x x x x x x x x x 。
CRC-32出错的概率比CRC-16低510-倍]4[。
由于CRC-32的可靠性,把CRC-32用于重要数据传输十分合适,所以在通信、计算机等领域运用十分广泛。
在一些UART 通信控制芯片(如MC6582、Intel8273和Z80-SIO )内,都采用了CRC 校验码进行差错控制;以太网卡芯片、MPEG 解码芯片中,也采用CRC-32进行差错控制。
二、CRC 校验码的算法分析CRC 校验码的编码方法是用待发送的二进制数据t (x )除以生成多项式g (x ),将最后的余数作为CRC 校验码。
其实现步骤如下:(1) 设待发送的数据块是m 位的二进制多项式t (x ),生成多项式为r 阶的g (x )。
在数据块的末尾添加r 个0,数据块的长度增加到m+r 位,对应的二进制多项式为)(x t x r 。
(2) 用生成多项式g (x )去除)(x t x r ,求得余数为阶数为r-1的二进制多项式y (x )。
此二进制多项式y (x )就是t (x )经过生成多项式g (x )编码的CRC 校验码。
(3) 用)(x t x r 以模2的方式减去y (x ),得到二进制多项式)('x t x r 。
)('x t x r 就是包含了CRC 校验码的待发送字符串。
从CRC 的编码规则可以看出,CRC 编码实际上是将代发送的m 位二进制多项式t (x )转换成了可以被g (x )除尽的m+r 位二进制多项式)('x t x r ,所以解码时可以用接受到的数据去除g (x ),如果余数位零,则表示传输过程没有错误;如果余数不为零,则在传输过程中肯定存在错误。
许多CRC 的硬件解码电路就是按这种方式进行检错的。
同时)('x t x r 可以看做是由t (x )和CRC 校验码的组合,所以解码时将接收到的二进制数据去掉尾部的r 位数据,得到的就是原始数据。
为了更清楚的了解CRC 校验码的编码过程,下面用一个简单的例子来说明CRC 校验码的编码过程。
由于CRC-32、CRC-16、CCITT 和CRC-4的编码过程基本一致,只有位数和生成多项式不一样。
为了叙述简单,用一个CRC-4编码的例子来说明CRC 的编码过程。
设待发送的数据t (x )为12位的二进制数据100100011100;CRC-4的生成多项式为g (x )=14++x x ,阶数r 为4,即10011。
首先在t (x )的末尾添加4个0构成)(4x t x ,数据块就成了1001000111000000。
然后用g (x )去除)(4x t x ,不用管商是多少,只需要求得余数y (x )。
下表为从上面表中可以看出,CRC 编码实际上是一个循环移位的模2运算。
对CRC-4,我们假设有一个5 bits的寄存器,通过反复的移位和进行CRC的除法,那么最终该寄存器中的值去掉最高一位就是我们所要求的余数。
所以可以将上述步骤用下面的流程描述://reg是一个5 bits的寄存器把reg中的值置0.把原始的数据后添加r个0.While (数据未处理完)BeginIf (reg首位是1)reg = reg XOR 0011.把reg中的值左移一位,读入一个新的数据并置于register的0 bit的位置。
Endreg的后四位就是我们所要求的余数。
这种算法简单,容易实现,对任意长度生成多项式的G(x)都适用。
在发送的数据不长的情况下可以使用。
但是如果发送的数据块很长的话,这种方法就不太适合了。
它一次只能处理一位数据,效率太低。
为了提高处理效率,可以一次处理4位、8位、16位、32位。
由于处理器的结构基本上都支持8位数据的处理,所以一次处理8位比较合适。
为了对优化后的算法有一种直观的了解,先将上面的算法换个角度理解一下。
在上面例子中,可以将编码过程看作如下过程:由于最后只需要余数,所以我们只看后四位。
构造一个四位的寄存器reg,初值为0,数据依次移入reg0(reg的0位),同时reg3的数据移出reg。
有上面的算法可以知道,只有当移出的数据为1时,reg才和g(x)进行XOR运算;移出的数据为0时,reg不与g(x)进行XOR运算,相当与和0000进行XOR运算。
就是说,reg和什么样的数据进行XOR移出的数据决定。
由于只有一个bit,所以有12种选择。
上述算法可以描述如下,//reg是一个4 bits的寄存器初始化t[]={0011,0000}把reg中的值置0.把原始的数据后添加r个0.While (数据未处理完)Begin把reg中的值左移一位,读入一个新的数据并置于register的0 bit的位置。
reg = reg XOR t[移出的位]End上面算法是以bit为单位进行处理的,可以将上述算法扩展到8位,即以Byte为单位进行处理,即CRC-32。
构造一个四个Byte的寄存器reg,初值为0x00000000,数据依次移入reg0(reg的0字节,以下类似),同时reg3的数据移出reg。
用上面的算法类推可知,移出的数据字节决定reg和什么样的数据进行XOR。
由于有8个bit,所以有82种选择。
上述算法可以描述如下://reg是一个4 Byte的寄存器初始化t[]={…}//共有82=256项把reg中的值置0.把原始的数据后添加r/8个0字节.While (数据未处理完)Begin把reg中的值左移一个字节,读入一个新的字节并置于reg的第0个byte的位置。
reg = reg XOR t[移出的字节]End算法的依据和多项式除法性质有关。
如果一个m位的多项式t(x)除以一个r阶的生成多项式g (x ),011222211)(a x a x a x a x a x t m m m m +++⋅⋅⋅++=----,将每一位k k x a (0=<k<m )提出来,在后面不足r 个0后,单独去除g (x ),得到的余式位)(x y k 。
则将)()()(021x y x y x y m m ⊕⋅⋅⋅⊕⊕--后得到的就是t (x )由生成多项式g (x )得到的余式。
对于CRC-32,可以将每个字节在后面补上32个0后与生成多项式进行运算,得到余式和此字节唯一对应,这个余式就是上面算法种t[]中的值,由于一个字节有8位,所以t[]共有82=256项。
多项式运算性质可以参见参考文献[1]。
这种算法每次处理一个字节,通过查表法进行运算,大大提高了处理速度,故为大多数应用所采用。
三、CRC-32的程序实现。
为了提高编码效率,在实际运用中大多采用查表法来完成CRC-32校验,下面是产生CRC-32校验吗的子程序。
unsigned long crc_32_tab[256]={0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,0x0edb8832,…, 0x5a05df1b, 0x2d02ef8d};//事先计算出的参数表,共有256项,未全部列出。