循环冗余检验CRC 算法原理

合集下载

循环冗余码crc校验方法原理

循环冗余码crc校验方法原理

循环冗余码crc校验方法原理循环冗余码(Cyclic Redundancy Check,CRC)是一种常用的错误检测方法,广泛应用于各种通信协议和数据传输系统中。

它通过生成简单的校验码来检测数据传输过程中的错误,并且可以检测到多个比特的错误。

CRC的原理是将数据和预先定义的除数进行异或运算,生成的余数作为校验码附加在传输的数据后面。

校验码的长度取决于除数的长度。

CRC校验过程大致分为以下几个步骤:1.选择除数:CRC校验使用一个预定义的除数,通常是一个固定的二进制数。

除数的长度决定了校验码的长度。

通常使用的除数是由多项式表示的,例如CRC-32使用的除数是0某04C11DB7。

2.对数据进行补位:为了保证数据与除数的位数一致,需要对数据进行补位操作。

通常是在数据的后面添加一些0,使得数据的位数与除数的位数相同。

3.生成校验码:将补位后的数据和除数进行异或运算,得到余数,这个余数就是校验码。

校验码的位数与除数的位数相同。

4.附加校验码:将生成的校验码附加到传输的数据后面,形成一个完整的帧。

5.接收端校验:接收端接收到数据后,执行同样的除数运算。

如果生成的余数与接收到的校验码相同,则数据没有出错。

如果不同,则数据传输过程中发生了错误。

CRC校验方法的优点包括计算简单、运算速度快、可靠性较高。

它可以检测到单比特、双比特、奇数比特和偶数比特的错误。

但是,CRC校验方法并不能纠正错误,只能检测错误。

当校验码本身出现错误时,也无法判断数据是否正确。

在实际应用中,CRC校验方法广泛应用于以太网、无线通信、存储介质等各种数据传输领域。

不同领域的应用可能使用不同的除数,以满足不同的数据传输要求。

总之,CRC校验方法利用除数运算生成校验码,通过校验码的比对来检测数据传输中的错误。

这种方法简单高效,广泛应用于各种通信协议和数据传输系统中,提高了数据传输的可靠性。

循环冗余码校验原理

循环冗余码校验原理

循环冗余码校验原理循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC。

它是利用除法及余数的原理来作错误侦测(Error Detecting)的。

他将要发送的数据比特序列当作一个多项式f(x)的系数,发送时用双方预先约定的生成多项式G(x)去除,求得一个余数多项式,将余数多项式加到数据多项式之后发送到接收端,接收端同样用G(x)去除接收到的数据,进行计算,然后把计算结果和实际接收到的余数多项式数据进行比较,相同的话表示传输正确。

CRC校验检错能力强,容易实现,是目前应用最广的检错码编码方式之一。

在国际标准中,根据生成多项式G(x)的不同,CRC又可分为以下几种标准:①CRC-12码: G(x)=X12+X11+X3+X2+X+1②CRC-16码: G(x)=X16+X15+X2+1③CRC-CCITT码: G(x)=X16+X12+X5+1④CRC-32码: G(x)=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+X+1 CRC-12码通常用来传送6-bit字符串。

CRC-16及CRC-CCITT码则用是来传送8-bit字符,其中CRC-16为美国采用,而CRC-CCITT为欧洲国家所采用。

CRC-32码大都被采用在一种称为Point-to-Point的同步传输中。

下面以最常用的CRC-16为例来说明其生成过程。

CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC 寄存器与8-bit的数据进行异或,之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,则无需进行异或。

重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位。

CRC校验原理及实现

CRC校验原理及实现

CRC校验原理及实现CRC(Cyclic Redundancy Check,循环冗余校验)是一种常用的错误检测技术,用于检测数据传输过程中的错误。

它通过使用一个或多个生成多项式来计算数据的校验值,然后将校验值添加到数据末尾传输。

接收方将使用相同的生成多项式来计算接收到的数据的校验值,并将其与接收到的校验值进行比较,如果不匹配,则说明数据存在错误。

CRC校验的核心原理是多项式除法,其中数据位被视为多项式的系数,并且我们可以使用位运算来表示多项式除法。

CRC校验使用的生成多项式通常是固定的,并被称为CRC多项式。

生成多项式的选择对于CRC校验的性能非常关键。

常用的CRC多项式包括CRC-16、CRC-32等。

实现CRC校验的步骤如下:1.选择一个适当的CRC多项式。

这个选择取决于应用的特定要求和标准。

2.将CRC初始值设为0。

3.将待传输的数据的每一个字节按位表示为一个多项式,并将他们连接成一个多项式。

4.对于每一个数据字节,将多项式除以CRC多项式。

可以使用位运算来进行除法运算。

5.将余数作为CRC多项式的系数与下一个数据字节连接形成一个新的多项式,并继续除法运算。

6.对于最后一个数据字节,除法完成后会有一个最终的余数。

将这个余数作为校验值。

7.在传输数据时,将校验值附加到数据的末尾。

8.接收方通过接收到的数据和附加的校验值进行相同的CRC校验过程。

9.接收方计算得到的校验值与接收到的校验值比较,如果相同,则数据传输正确;如果不同,则数据传输存在错误。

CRC校验具有高效、可靠和简单的特点。

它可以检测到大部分单比特错误和多比特错误。

然而,CRC校验只能检测错误,而不能纠正错误。

所以在实际应用中,通常需要结合其他的纠错方法,如重传机制,以确保数据传输的可靠性。

总结起来,CRC校验是一种常用的错误检测技术,利用多项式除法计算数据的校验值。

实现CRC校验需要选择适当的CRC多项式,并进行多次除法运算,然后将计算得到的校验值附加到数据末尾进行传输。

crc方法

crc方法

crc方法CRC方法全称为循环冗余校验(Cyclic Redundancy Check),是一种常用的差错检测技术。

它通过对数据进行按位异或运算,生成校验码,并将校验码附加在数据后面传输,接收方利用校验码进行校验,以判断数据传输是否出错。

CRC方法广泛应用于数据传输、网络通信和存储介质等领域。

CRC方法的基本原理是利用一个固定的生成多项式对数据进行除法运算。

具体而言,发送方首先根据生成多项式对待发送的数据进行除法运算,得到余数,将余数附加在数据后面发送。

接收方接收数据后,同样利用相同的生成多项式对接收到的数据进行除法运算,得到余数,如果余数为0,则说明数据传输没有出错;如果余数不为0,则说明数据传输出错。

在CRC方法中,生成多项式的选择非常重要。

常用的生成多项式有CRC-CCITT、CRC-16和CRC-32等。

不同的生成多项式对应不同的校验强度和校验码长度。

一般而言,校验码长度越长,校验强度越高,但传输效率也会降低。

CRC方法具有以下特点和优势:1. 高效性:CRC方法具有高效的检错能力,可以有效地检测出传输过程中的单个比特错误和多个连续比特错误。

2. 简单性:CRC方法的实现相对简单,计算速度较快,不需要大量的计算和存储资源。

3. 可靠性:CRC方法可以通过适当选择生成多项式,提高数据传输的可靠性和安全性。

4. 广泛应用:CRC方法广泛应用于数据通信、数据存储、网络传输等领域,保证了数据的可靠传输和存储。

除了以上优势,CRC方法也存在一些限制和局限性:1. 有限的检错能力:CRC方法只能检测出传输过程中的一部分错误,对于某些特殊的错误情况,如数据位数相同的错误,CRC方法无法检测出错误。

2. 无纠错能力:CRC方法只能检测错误,而不能纠正错误。

一旦发现数据传输出错,通常需要重新传输数据。

3. 生成多项式的选择:不同的应用场景需要选择不同的生成多项式,选择不当可能导致校验能力不足或过于复杂。

在实际应用中,CRC方法的使用需要注意以下几点:1. 生成多项式的选择:根据实际需求选择合适的生成多项式,平衡校验强度和传输效率。

循环冗余校验码的基本原理

循环冗余校验码的基本原理

循环冗余校验码的基本原理CRC的基本原理可以简述为以下几个步骤:1.初始化:选择一个固定长度的生成多项式,通常用于产生CRC码的生成多项式有CRC-8、CRC-16、CRC-32等。

初始化时,需要将这个多项式的二进制表示转化为一个与生成多项式长度相等的寄存器的初始值。

2.数据处理:将待检测的数据按照二进制的形式逐位进行计算。

从最高位开始,依次将每一位与寄存器的最高位(或最低位)进行XOR(异或)运算,生成新的寄存器值。

寄存器每经过一次XOR运算,要进行一次移位操作,将寄存器的所有位向左或向右移动一位。

如此重复,直到数据的所有位都经过了处理。

3.生成校验码:当所有的数据位都经过了处理后,得到的最终结果就是校验码。

这个校验码可以附加在数据的后面,一起传输。

接收端在接收到数据时,可以再次对数据与校验码进行相同的处理,得到一个新的校验码。

如果这个新的校验码与原始校验码一致,表示传输过程中没有出错,否则表示数据出现了错误或失真。

CRC的特点如下:1.误检率低:CRC可以有效地检测多种类型的传输错误,包括插入位错误、删除位错误和替换位错误。

根据生成多项式的选择和长度的设置,CRC码能够达到很高的检测效率。

2.简单高效:CRC算法的运算过程非常简单,只需要进行二进制的位运算,而不需要进行复杂的数值计算。

此外,CRC算法可以利用移位寄存器和异或运算的特性,使用硬件电路实现,提高运算速度和效率。

3.容错性强:CRC码能够检测数据传输过程中的单比特错误和多比特错误。

通过增加校验位的数量和选择合适的生成多项式,CRC码具备更好的容错性能,可以检测到更多的错误类型。

4.不可纠错:CRC算法只能检测错误,而不能纠正错误。

一旦数据出现错误,无法从CRC码中推导出正确的数据,只能重新发送或重新获取正确的数据。

总的来说,CRC是一种简单高效、误检率低、容错性强的错误检测码。

它被广泛应用于各种数据传输和存储场景,如计算机网络、通信系统、存储器、磁盘驱动器等。

循环冗余校验原理

循环冗余校验原理

循环冗余校验原理循环冗余校验(Cyclic Redundancy Check,CRC)是一种常用的数据传输错误检测技术,它通过对数据进行多项式计算生成一个校验码,并将该校验码附加在数据后面传输。

接收方接收到数据后,再对数据和校验码进行计算,如果计算结果与发送方生成的校验码一致,则说明数据传输过程中没有发生错误。

CRC的原理是基于余数定理和多项式除法。

将要传输的数据看作一个二进制数,在发送端对该数进行多项式除法运算,得到一个余数作为校验码。

接收方同样对接收到的数据进行多项式除法运算,并得到一个余数,如果该余数与发送方生成的校验码一致,则说明传输过程中没有发生错误。

具体地说,CRC通过以下步骤实现:1. 选择一个生成多项式G(x),通常为一个二进制数。

这个生成多项式必须满足以下条件:首先,它必须能够被二进制整除;其次,它必须能够检测出所有长度小于等于n位(n为生成多项式的位数)的单比特差错;最后,它必须尽可能地能够检测出所有长度大于n位的双比特差错。

2. 将要传输的数据看作一个二进制数,长度为n。

在该数的末尾添加一个长度为n-1的0序列,得到一个长度为2n-1的新数。

3. 将生成多项式左移n-1位,得到一个长度为2n-1的多项式P(x)。

4. 对新数和P(x)进行模2除法运算,得到一个余数R(x)。

将该余数附加在原数据后面传输。

5. 接收方接收到数据后,同样将数据看作一个二进制数,并在末尾添加一个长度为n-1的0序列,得到一个长度为2n-1的新数。

然后对新数和P(x)进行模2除法运算,得到余数R'(x)。

6. 如果R'(x)=0,则说明传输过程中没有发生错误;否则说明发生了错误。

总之,CRC通过对数据进行多项式计算生成校验码,并将其附加在原数据后面传输,接收方再对数据和校验码进行计算以检测是否发生错误。

它具有高效、简单、可靠等优点,在通信领域中被广泛应用。

循环冗余校验码原理

循环冗余校验码原理
移植性。需使用CRC校验码机制的通信软件,均可调用这两个函数高效地实现CRC校验码
软件编码和校验功能。
误检测按模2除法运算,用接收到的CRC位串除以G(X)位串,看是否能够除尽即可确定。
下面的C语言模块实现了CRC校验码编码和检错功能,程序中的G(X)使用CRC-16,
相应的位串为1100000000000101,用十六进制表示为0xc005。函数CrcGen以待发送的原始
数据缓冲区地址和缓冲区长度(字节数)为入口参数,产生并返回遵循CRC校验码编码规则
从crc校验码编码规则可以看出crc校验码实际上是由原始数据位串和紧跟其后的与gx位串等长的冗余位串组成只要求出此冗余位串发送方即可将原始数据和冗余位串装配成一crc位串序列后再发送
1、循环冗余校验码原理
CRC校验采用多项式编码方法,如一个8位二进制数(B7B6B5B4B3B2B1B0)可以用7
阶二进制码多项式B7X7+B6X6+B5X5+B4X4+B3X3+B2X2+B1X1+B0X0表示。
从CRC校验码编码规则可以看出,CRC校验码实际上是由原始数据位串和紧跟其后的
与G(X)位串等长的冗余位串组成,只要求出此冗余位串,发送方即可将原始数据和冗余位
串装配成一CRC位串序列后再发送。CRC校验码译码非常简单,只需从接收到正确CRC
校验码尾部截掉与G(X)位串等长冗余位串,余下的部分即为原始数据位串。CRC校验码错
while(--len>=0)

ch=*crcbuf++;ch<<=8;
for(i=0;i<8;i++)

crc<<=1;
if((ch&0x8000)!=0)crc|=1;

【计算机网络】循环冗余校验CRC算法原理计算过程

【计算机网络】循环冗余校验CRC算法原理计算过程

【计算机⽹络】循环冗余校验CRC算法原理计算过程前⾔我们知道,⼀台主机向另外⼀台主机发送报⽂的时候,需要⼀层层经过⾃⼰的协议栈进⾏数据封装,到达最后⼀层(四层协议的⽹络接⼝层)时需要在帧尾部添加FCS校验码(通过CRC算法得出)。

当对端主机收到时,在接收端同样通过CRC算法进⾏验证,确认传输过程中是否出现错误。

它只能确认⼀个帧是否存在⽐特差错,但没有提供解决措施。

循环冗余校验的原理1. 在发送端,先把数据划分为组(即:⼀帧)。

假定每组 k 个⽐特。

2. 在每组后⾯,添加供差错检测⽤的 n 位冗余码⼀起发送。

即:实际发送长度为:k+n ⽐特。

3. 发送前双⽅协商n+1位的除数P,⽅便接收⽅收到后校验。

4. 给K⽐特的数据添加除数减⼀个0(P-1)作为被除数,与第三步确定的除数做“模2除法”。

得出的余数即FCS校验序列,它的位数也必须是(P-1)。

5. 将FCS校验序列添加⾄K个⽐特位的后⾯发送出去。

6. 接收⽅对接收到的每⼀帧进⾏校验,若得出的余数 R = 0,则判定这个帧没有差错,就接受(accept)。

若余数 R ≠ 0,则判定这个帧有差错,就丢弃。

对“模2除法”进⾏说明:“模2除法”与“算术除法”类似,但它既不向上位借位,也不⽐较除数和被除数的相同位数值的⼤⼩,只要以相同位数进⾏相除即可。

模2加法运算为:1+1=0,0+1=1,0+0=0,⽆进位,也⽆借位;模2减法运算为:1-1=0,0-1=1,1-0=1,0-0=0,也⽆进位,⽆借位。

相当于⼆进制中的逻辑异或运算。

计算⽰例那么接收⽅拿到的就是:101001001。

再以它为被除数,1101为除数进⾏“模2除法”。

CRC循环冗余校验的原理

CRC循环冗余校验的原理

CRC循环冗余校验的原理循环冗余校验(CRC)是一种用于检测或纠正错误的数据校验方法,常用于通信中对数据进行完整性校验。

CRC的原理是利用一个固定的产生多项式对数据进行除法运算,并将余数作为校验码添加到数据中,接收方通过对接收到的数据再次进行除法运算,将得到的余数与发送方发送的校验码进行比较,用于判断接收到的数据是否出现了错误。

CRC的计算方式如下:1.选择一个生成多项式,该多项式的位数比待校验数据的位数少1、通常使用的生成多项式有常用的CRC-32和CRC-16多项式。

2.在待校验数据后添加一组位数等于生成多项式位数的0,这个数据称为"扩展数据"。

3.将扩展数据除以生成多项式,取得的余数即为校验码。

4.将校验码添加到原数据后,形成带有校验码的完整数据,即为发送数据。

例如,我们用CRC-16多项式来演示CRC的运算步骤。

生成多项式是一个16位的二进制数:10001101000101000(0x1021)。

假设我们发送的数据是一个16位的二进制数:11010101000111100。

第一步,在待校验数据后添加16位的0,形成扩展数据:110101010001111000000000000000000。

第二步,将扩展数据与生成多项式进行除法运算,得到的余数为:0100110011100100(0x4CE4)。

第三步,将校验码添加到原数据后,得到发送数据为:110101010001111000100110011100100。

这样,发送方将这个发送数据发送给接收方。

接收方接收到数据后,进行相同的操作,再次用生成多项式进行除法运算,得到余数。

如果余数为0,则表明数据没有错误;如果余数不为0,则表明数据存在错误。

CRC的性质和应用:1.CRC可以检测出所有奇数位数量的错误,以及几乎所有偶数位数量的错误。

对于t位的生成多项式,CRC可以检测出所有长度小于t的错误序列。

2.CRC不仅可以用于数据的检错,还可以用于数据的纠错。

crc校验基本原理

crc校验基本原理

crc校验基本原理CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。

循环冗余校验码(CRC)的基本原理在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码又叫(N,K)码。

对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。

根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。

校验码的具体生成过程为:假设发送信息用信息多项式C(X)表示,将C(x)左移R位,则可表示成C(x)*2的R次方,这样C(x)的右边就会空出R位,这就是校验码的位置。

通过C(x)*2的R次方除以生成多项式G(x)得到的余数就是校验码。

CRC几个基本概念1、多项式与二进制数码多项式和二进制数有直接对应关系:x的最高幂次对应二进制数的最高位,以下各位对应多项式的各幂次,有此幂次项对应1,无此幂次项对应0。

可以看出:x的最高幂次为R,转换成对应的二进制数有R+1位。

多项式包括生成多项式G(x)和信息多项式C(x)。

如生成多项式为G(x)=x4+x3+x+1,可转换为二进制数码11011。

而发送信息位1111,可转换为数据多项式为C(x)=x3+x2+x+1。

2、生成多项式是接受方和发送方的一个约定,也就是一个二进制数,在整个传输过程中,这个数始终保持不变。

在发送方,利用生成多项式对信息多项式做模2除生成校验码。

在接受方利用生成多项式对收到的编码多项式做模2除检测和确定错误位置。

应满足以下条件:a、生成多项式的最高位和最低位必须为1。

b、当被传送信息(CRC码)任何一位发生错误时,被生成多项式做除后应该使余数不为0。

c、不同位发生错误时,应该使余数不同。

d、对余数继续做除,应使余数循环。

将这些要求反映为数学关系是比较复杂的。

但可以从有关资料查到常用的对应于不同码制的生成多项式如图9所示:N K 码距d G(x)多项式 G(x)7 4 3 x3+x+110117 4 3 x3+x2+111017 3 4 x4+x3+x2+1111017 3 4 x4+x2+x+11011115 11 3 x4+x+11001115 7 5 x8+x7+x6+x4+111101000131 26 3 x5+x2+110010131 21 5 x10+x9+x8+x6+x5+x3+11110110100163 57 3 x6+x+1100001163 51 5 x12+x10+x5+x4+x2+110100001101011041 1024 x16+x15+x2+1110000000000001013 CRC码的生成步骤1、将x的最高幂次为R的生成多项式G(x)转换成对应的R+1位二进制数。

循环冗余校验码(CRC)的基本原理

循环冗余校验码(CRC)的基本原理

循环冗余校验码(CRC)的基本原理循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码又叫(N,K)码。

对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R 的多项式G(x)。

根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。

校验码的具体生成过程为:假设发送信息用信息多项式f(X)表示,将f(x)左移R位(则可表示成f(x)*X R),这样f(x)的右边就会空出R位,这就是校验码的位置。

通过f(x)* X R除以生成多项式G(x)得到的余数就是校验码。

几个基本概念1、多项式与二进制数码多项式和二进制数有直接对应关系:x的最高幂次对应二进制数的最高位,以下各位对应多项式的各幂次,有此幂次项对应1,无此幂次项对应0。

可以看出:x的最高幂次为R,转换成对应的二进制数有R+1位。

多项式包括生成多项式G(x)和信息多项式f(x)。

如生成多项式为G(x)=X4+X3+X+1,可转换为二进制数码11011。

而发送信息位1111,可转换为数据多项式为f(x)=X3+X2+X+1。

2、生成多项式是接受方和发送方的一个约定,也就是一个二进制数,在整个传输过程中,这个数始终保持不变。

在发送方,利用生成多项式对信息多项式做模2除生成校验码。

在接受方利用生成多项式对收到的编码多项式做模2除检测和确定错误位置。

应满足以下条件:a、生成多项式的最高位和最低位必须为1。

b、当被传送信息(CRC码)任何一位发生错误时,被生成多项式做模2除后应该使余数不为0。

c、不同位发生错误时,应该使余数不同。

d、对余数继续做模2除,应使余数循环。

将这些要求反映为数学关系是比较复杂的。

但可以从有关资料查到常用的对应于不同码制的生成多项式如图9所示:N K 码距d G(x)多项式G(x)7 4 3 x3+x+1 10117 4 3 x3+x2+1 11017 3 4 x4+x3+x2+1 111017 3 4 x4+x2+x+1 1011115 11 3 x4+x+1 1001115 7 5 x8+x7+x6+x4+1 11101000131 26 3 x5+x2+1 10010131 21 5 x10+x9+x8+x6+x5+x3+1 11101101 00163 57 3 x6+x+1 100001163 51 5 x12+x10+x5+x4+x2+1 10100001 101011041 1024 x16+x15+x2+1 110000000000 00101图9 常用的生成多项式3、模2除(按位除)模2除做法与算术除法类似,但每一位除(减)的结果不影响其它位,即不向上一位借位。

循环冗余检验 (CRC) 算法原理

循环冗余检验 (CRC) 算法原理

循环冗余检验(CRC) 算法原理Cyclic R edundancy C heck循环冗余检验,是基于数据计算一组效验码,用于核对数据传输过程中是否被更改或传输错误。

算法原理假设数据传输过程中需要发送15位的二进制信息g=101001110100001,这串二进制码可表示为代数多项式g(x) = x^14 + x^12 + x^9 + x^8 + x^7 + x^5 + 1,其中g中第k 位的值,对应g(x)中x^k的系数。

将g(x)乘以x^m,既将g后加m个0,然后除以m阶多项式h(x),得到的(m-1)阶余项r(x)对应的二进制码r就是CRC编码。

h(x)可以自由选择或者使用国际通行标准,一般按照h(x)的阶数m,将CRC算法称为CRC-m,比如CRC-32、CRC-64等。

国际通行标准可以参看/wiki/Cyclic_redundancy_checkg(x)和h(x)的除运算,可以通过g和h做xor(异或)运算。

比如将11001与10101做xor运算:明白了xor运算法则后,举一个例子使用CRC-8算法求101001110100001的效验码。

CRC-8标准的h(x) = x^8 + x^7 + x^6 + x^4 + x^2 + 1,既h是9位的二进制串111010101。

经过迭代运算后,最终得到的r是10001100,这就是CRC效验码。

通过示例,可以发现一些规律,依据这些规律调整算法:1. 每次迭代,根据gk的首位决定b,b是与gk进行运算的二进制码。

若gk的首位是1,则b=h;若gk的首位是0,则b=0,或者跳过此次迭代,上面的例子中就是碰到0后直接跳到后面的非零位。

2. 每次迭代,gk的首位将会被移出,所以只需考虑第2位后计算即可。

这样就可以舍弃h的首位,将b取h的后m位。

比如CRC-8的h是111010101,b只需是11010101。

3. 每次迭代,受到影响的是gk的前m位,所以构建一个m位的寄存器S,此寄存器储存gk的前m位。

循环冗余校验码(crc)的基本原理

循环冗余校验码(crc)的基本原理
供选择的答案:
A:①水平垂直奇偶校验②循环求和
③循环冗余④正比率
B:①模2除法②定点二进制除法
③二-十进制除法④循环移位法
C:①1100101010111②110010101010011
③110010101011100④110010101010101
D:①可纠正一位差错②可检测所有偶数位错
③可检测所有小于校验位长度的突发错
5、通信与网络中常用的CRC
在数据通信与网络中,通常k相当大,由一千甚至数千数据位构成一帧,而后采用CRC码产生r位的校验位。它只能检测出错误,而不能纠正错误。一般取r=16,标准的16位生成多项式有CRC-16=x16+x15+x2+1和CRC-CCITT=x16+x15+x2+1。
【例1】某循环冗余码(CRC)的生成多项式G(x)=x3+x2+1,用此生成多项式产生的冗余位,加在信息位后形成CRC码。若发送信息位1111和1100则它的CRC码分别为_A_和_B_。由于某种原因,使接收端收到了按某种规律可判断为出错的CRC码,例如码字_C_、_D_、和_E_。(1998年试题11)
1011
------------
11-------余数(校验位)
(4)编码后的报文(CRC码):
1010000
+ 11
------------------
1010011
CRC码为1010011(和纠错)。
在接收端收到了CRC码后用生成多项式为G(x)去做模2除,若得到余数为0,则码字无误。若得到余数不为0,则接收的数据有错。
(2)此题生成多项式有4位(R+1),要把原始报文F(x)左移3(R)位变成1010000

循环冗余校验码(CRC)的基本原理

循环冗余校验码(CRC)的基本原理

循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码又叫(N,K)码。

对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。

根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。

校验码的具体生成过程为:假设发送信息用信息多项式C(X)表示,将C(x)左移R位,则可表示成C(x)*2R,这样C(x)的右边就会空出R位,这就是校验码的位置。

通过C(x)*2R除以生成多项式G(x)得到的余数就是校验码。

几个基本概念1、多项式与二进制数码多项式和二进制数有直接对应关系:x的最高幂次对应二进制数的最高位,以下各位对应多项式的各幂次,有此幂次项对应1,无此幂次项对应0。

可以看出:x的最高幂次为R,转换成对应的二进制数有R+1位。

多项式包括生成多项式G(x)和信息多项式C(x)。

如生成多项式为G(x)=X^4+X^3+X+1,可转换为二进制数码11011。

而发送信息位1111,可转换为数据多项式为C(x)=X^3+X^2+X+1。

2、生成多项式是接受方和发送方的一个约定,也就是一个二进制数,在整个传输过程中,这个数始终保持不变。

在发送方,利用生成多项式对信息多项式做模2除生成校验码。

在接受方利用生成多项式对收到的编码多项式做模2除检测和确定错误位置。

应满足以下条件:a、生成多项式的最高位和最低位必须为1。

b、当被传送信息(CRC码)任何一位发生错误时,被生成多项式做模2除后应该使余数不为0。

c、不同位发生错误时,应该使余数不同。

d、对余数继续做模2除,应使余数循环。

将这些要求反映为数学关系是比较复杂的。

但可以从有关资料查到常用的对应于不同码制的生成多项式如图9所示:N K 码距d G(x)多项式G(x)7 4 3 x3+x+1 10117 4 3 x3+x2+1 11017 3 4 x4+x3+x2+1 111017 3 4 x4+x2+x+1 1011115 11 3 x4+x+1 1001115 7 5 x8+x7+x6+x4+1 11101000131 26 3 x5+x2+1 10010131 21 5 x10+x9+x8+x6+x5+x3+1 1110110100163 57 3 x6+x+1 100001163 51 5 x12+x10+x5+x4+x2+1 10100001101011041 1024 x16+x15+x2+1 11000000000000101图9 常用的生成多项式3、模2除(按位除)模2除做法与算术除法类似,但每一位除(减)的结果不影响其它位,即不向上一位借位。

循环冗余算法设计总结

循环冗余算法设计总结

循环冗余算法设计总结
循环冗余算法(Cyclic Redundancy Check,CRC)是一种常用的数据校验方法,用于检测在数据传输过程中是否出现了错误。

CRC算法的设计总结如下:
1. 算法原理:通过多项式运算来生成校验码,然后在数据传输中对数据进行校验,以保证数据的完整性。

2. 算法步骤:
- 将CRC寄存器的数据右移一位,高位补零,并检查溢出位。

- 如果移出位为0,重复第三步;若低位为1,CRC寄存器与多项式码(此处取0xA001即二进制101000000000001)相异或。

- 重复第3步与第4步直到8次移位全部完成。

- 重复第2至第5步直到所有数据全部处理完毕。

- 最后将寄存器的高8位数值与寄存器的低8位数值交换位置,即得到CRC的最终值。

CRC算法具有检错能力极强、开销小、易于用编码器及检测电路实现等特点,在通信系统中得到了广泛的应用。

CRC校验原理及步骤

CRC校验原理及步骤

CRC校验原理及步骤标准化管理处编码[BBX968T-XBB8968-NNJ668-MM9N]CRC校验原理及步骤什么是CRC校验CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。

循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

CRC校验原理:其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。

当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)。

到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。

因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。

如果有余数,则表明该帧在传输过程中出现了差错。

模2除法:模2除法与算术除法类似,但每一位除的结果不影响其它位,即不向上一位借位,所以实际上就是异或。

在循环冗余校验码(CRC)的计算中有应用到模2除法。

例:CRC校验步骤:CRC校验中有两个关键点,一是预先确定一个发送送端和接收端都用来作为除数的二进制比特串(或多项式),可以随机选择,也可以使用国际标准,但是最高位和最低位必须为1;二是把原始帧与上面计算出的除数进行模2除法运算,计算出CRC码。

具体步骤:1. 选择合适的除数2. 看选定除数的二进制位数,然后再要发送的数据帧上面加上这个位数-1位的0,然后用新生成的帧以模2除法的方式除上面的除数,得到的余数就是该帧的CRC校验码。

注意,余数的位数一定只比除数位数少一位,也就是CRC校验码位数比除数位数少一位,如果前面位是0也不能省略。

循环冗余码crc校验方法原理

循环冗余码crc校验方法原理

循环冗余码crc校验方法原理CRC校验方法通过对待传输的数据进行计算,生成一组校验码,然后将校验码与数据一起传输。

接收方在收到数据后再次进行计算,如果接收到的校验码与计算得到的校验码一致,就表示数据传输过程中没有出错。

CRC校验是一种循环多项式计算方法。

具体原理如下:1. 定义一个产生多项式G,它是一个比特序列。

这个多项式进行无符号二进制数运算,通常写成如28-bit、32-bit等形式。

G为CRC生成多项式,与被校验数据的位数相关。

2.将待传输的数据D看做一个多项式,记为M(x),其中x为一个变量。

M(x)的次数不大于G的次数(G的次数等于M(x)的位数减去1)。

3.引入冗余位R,即是生成的校验码,也是一个比特序列。

R(x)的次数不大于G的次数。

4.计算M(x)乘以x的幂次后除以G,这个操作表示对M(x)进行长除法操作,最后得到商Q(x)和余数R(x)。

Q(x)表示M(x)与G的长除法过程中的商。

5.将R(x)作为冗余位添加到M(x)的低位,形成一个新的数M'(x)。

6.M'(x)除以G,得到R'(x)。

R`(x)通常是0,如果不为0,就表示传输过程中发生了错误。

7.将R'(x)作为校验码发送给接收方,接收方在收到数据后重复以上操作计算出的R’(x)与接收到的R'(x)进行比较。

如果在计算过程中R(x)和R'(x)相等,就表示数据没有出错。

如果不相等,则说明在数据传输过程中发生了错误。

接收方可以通过比较R(x)和R'(x)的差异来确定出错的位置,并进行识别和纠错。

CRC校验方法的优点在于简单、高效。

由于CRC码是通过位运算,可以通过硬件电路或者软件算法来实现,具有较高的速度和性能。

此外,CRC码还具有较好的错误检测能力,能够检测出多位、批量错误。

总的来说,CRC校验方法利用多项式的除法原理,在待传输的数据上附加一组冗余位校验码,接收方通过对数据进行相同的计算,可以判断数据传输是否出错,并进行错误检测和纠正。

循环冗余校验码原理

循环冗余校验码原理

循环冗余校验码原理循环冗余校验码(Cyclic Redundancy Check,CRC)是一种常用的差错检测技术,用于在传输和存储数据时检测数据的完整性。

CRC码可以通过计算出的校验值与接收到的数据进行比对,如果不一致,则说明数据在传输过程中发生了错误。

CRC原理基于多项式除法。

待传输的数据可以看作是一个二进制数的多项式,校验位(CRC码)也是一个二进制数的多项式。

计算CRC码的基本思想是将待传输的数据与一个特定的CRC生成多项式进行除法运算,得到余数作为CRC码。

CRC码的计算过程如下:1.定义生成多项式G(x)(也称为生成器)和待传输的数据D(x)。

2.将G(x)的最高次项系数设为1,其余系数为0,得到长度为n+1的二进制数,记作G。

3.在D(x)的最高次项之后添加长度为n的0,得到长度为n+m的二进制数,记作T。

4.用T除以G,计算商和余数。

商是传输的数据,余数是计算得到的CRC码。

5.把CRC码添加到待传输的数据后面,得到带有CRC校验位的数据。

在接收端,将接收到的数据与生成多项式G(x)进行除法运算,如果余数为0,则说明数据没有发生错误;如果余数不为0,则说明数据发生了错误。

CRC码的一个重要特点是具有统计独立性,即任何一个比特错误都只有一半的可能性会导致无法检测出来。

这是因为生成多项式G(x)是一个固定的多项式,在任何一个比特错误的位置上,接收端能够检测到错误的概率为1/2另一个重要的特点是检测到错误的概率可以通过CRC的位数进行控制。

CRC的位数越多,检测到错误的概率越小。

通常,CRC码的位数为16位或32位,能够提供较高的错误检测能力。

常用的CRC标准包括CRC-8、CRC-16和CRC-32等,不同的标准使用不同的生成多项式,以适应不同的应用需求。

总结起来,CRC是一种通过计算出的校验值与接收到的数据进行比对的差错检测技术。

CRC的计算过程基于多项式除法,利用特定的生成多项式对待传输的数据进行除法运算,得到余数作为CRC码。

循环冗余校验的原理

循环冗余校验的原理

循环冗余校验(CRC,Cyclic Redundancy check) • 码多项式及其算术运算 假设循环码为 C= Cn-1 Cn-2…. C2 C1 C0
长度为n
M的码多项式(称为n-1次多项式) C(x) = Cn-1 xn-1 + Cn-2xn-2 + …. C2 x2 +C1 x + C0 例1: C = 1100101 C(x) =1x6 + 1x5 +0x4 +0x3 + 1x2 +0 x + 1 = x6 + x5 +x2 + 1
模2加=模2减 模 2乘 模2除=乘的可逆运算
பைடு நூலகம்
10110 10011
10100 10011 1110
余数 r(x)
差错检测
循环冗余校验码(CRC,Cyclic Redundancy check)
在接收端本来应该收到: c(x) = xr· m(x) + r(x) = Q(x)· P(x) 用协商好的生成多项式P(x)去除c(x),从余数来判断是否出错
差错检测方法
循环冗余校验(CRC,Cyclic Redundancy check)
将要传送的信息分成码组M,然后按某一种约定的规律 对每一个信息码组附加一些校验的码元R,形成新的码
组C,使得C中的码元之间具有一定的相关性(即码组中 “1”和“0”的出现彼此相关),再传输到接收端; 接收端根据这种相关性或规律性来校验码组C是否正确 ,还可对出错码组的错定位加以相应的纠正,最后将码 组C还原成信息码组M。
(2) x4· m(x) = 1101011011,0000
(3)
1101011011.0000 10011 商数:1100001010 余数:1110 r(x) = x3 + x2 + x + 0

CRC校验算法详解

CRC校验算法详解

CRC校验算法详解循环冗余校验(Cyclic Redundancy Check,CRC)是一种常用的错误校验算法,主要用于数据传输过程中的差错检测。

它将数据视为二进制数,通过生成多项式与数据进行异或运算,最后产生一个余数,将该余数作为校验码附加在数据末尾,接收方通过相同的生成多项式进行校验,如果余数为0,则认为数据传输无误。

CRC校验算法的基本原理是:通过生成多项式对整个数据进行模2除法运算,并得到一个余数作为校验码。

在数据传输过程中,发送方将原始数据和校验码一起发送给接收方,接收方利用相同的生成多项式对整个数据进行除法运算,并检查余数是否为0,来判断数据传输是否正确。

1.确定生成多项式:CRC校验算法中最重要的是生成多项式,它决定了校验能力的大小。

生成多项式通常在最高位和最低位都为1,其他位数也应该尽量选择为1、常用的生成多项式有CRC-8、CRC-16、CRC-32等,每种生成多项式的校验能力不同。

2.将生成多项式转换为二进制数:将生成多项式转换为二进制数表示,用多项式系数的二进制表示法来表示生成多项式。

3.将待发送的数据与校验码进行拼接:在发送数据的最后面添加足够位数的0,等于生成多项式次数减1,将生成多项式次方数减1的二进制表示添加到待发送的数据末尾。

4.进行模2除法运算:将待发送的数据与生成多项式进行模2除法运算,将得到的余数作为校验码。

5.发送数据与校验码:将原始数据与校验码一起发送给接收方,接收方接收到数据后利用相同的生成多项式进行除法运算。

6.检验余数是否为0:接收方进行除法运算后,检查得到的余数是否为0,如果余数为0,则认为数据传输无误;如果余数不为0,则认为数据传输存在错误。

CRC校验算法的优点是简单且高效,能够检测多位错误,且校验码的长度可以根据生成多项式的次方数来确定,可以根据不同的数据传输要求进行调整。

缺点则是无法纠正错误,只能检测错误的存在,需要额外的处理机制来进行纠正。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CRC的校验原理随着数据采集系统的功能日益强大,以及微型计算机的普及,在现代工业中,利用微机进行数据通讯的工业控制应用得也越来越广泛。

特别是在大规模高精度数据采集系统中,对数据进行分析和计算将占用很大一部分单片机的资源,可以将采集到的数据通过串行通讯方式传送给PC机,由PC机来完成数据的处理工作。

但是由于传输距离、现场状况等诸多可能出现的因素的影响,计算机与受控设备之间的通讯数据常会发生无法预测的错误。

为了防止错误所带来的影响,在数据的接收端必须进行差错校验。

虽然差错校验也可以完全由硬件来承担,但由于单片机和PC都具有很强的软件编程能力,这就为实施软件的差错校验提供了前提条件,而软件的差错校验有经济实用并且不增加硬件开销的优点。

1 、CRC法的原理传统的差错检验法有:奇偶校验法,校验和法,行列冗余校验法等。

这些方法都是在数据后面加一定数量的冗余位同时发送出去,例如在单片机的通讯方式2和3中,TB8就可以作为奇偶校验位同数据一起发送出去,在数据的接收端通过对数据信息进行比较、判别或简单的求和运算,然后将所得和接收到的冗余位进行比较,若相等就认为数据接收正确,否则就认为数据传送过程中出现错误。

但是冗余位只能反映数据行或列的奇偶情况,这类检验方法对数据行或列的偶数个错误不敏感,漏判的概率很高。

因此,此种方法的可靠性就差。

循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC。

它是利用除法及余数的原理来作错误侦测(Error Detecting)的。

实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CR C值不同,则说明数据通讯出现错误。

由于这种方法取得校验码的方式具有很强的信息覆盖能力,所以它是一种效率极高的错误校验法。

错误的概率几乎为零。

在很多的仪器设备中都采用这种冗余校验的通讯规约。

根据应用环境与习惯的不同,CRC又可分为以下几种标准:①CRC-12码;②CRC-16码;③CRC-CCITT码;④CRC-32码。

CRC-12码通常用来传送6-bit字符串。

CRC-16及CRC-CCITT码则是用来传送8-b it字符,其中CRC-16为美国采用,而CRC-CCITT为欧洲国家所采用。

CRC-32码大都被采用在一种称为Point-to-Point的同步传输中。

2、CRC校验码的生成过程2.1原理分析过程假设数据传输过程中需要发送15位的二进制信息g=101001110100001,这串二进制码可表示为代数多项式g(x) = x^14 + x^12 + x^9 + x^8 + x^7 + x^5 + 1,其中g中第k位的值,对应g(x)中x^k的系数。

将g(x)乘以x^m,既将g后加m个0,然后除以m阶多项式h(x),得到的(m-1)阶余项r(x)对应的二进制码r就是CRC编码。

h(x)可以自由选择或者使用国际通行标准,一般按照h(x)的阶数m,将CRC算法称为CRC-m,比如CRC-32、CRC-64等。

国际通行标准可参看/wiki/Cyclic_redundancy_check g(x)和h(x)的除运算,可以通过g和h做xor(异或)运算。

比如将11001与10101做xor运算:明白了xor运算法则后,举一个例子使用CRC-8算法求101001110100001的效验码。

CRC-8标准的h(x) = x^8 + x^7 + x^6 + x^4 + x^2 + 1,既h是9位的二进制串111010101。

经过迭代运算后,最终得到的r是10001100,这就是CRC效验码。

通过示例,可以发现一些规律,依据这些规律调整算法:1. 每次迭代,根据gk的首位决定b,b是与gk进行运算的二进制码。

若gk的首位是1,则b=h;若gk的首位是0,则b=0,或者跳过此次迭代,上面的例子中就是碰到0后直接跳到后面的非零位。

2. 每次迭代,gk的首位将会被移出,所以只需考虑第2位后计算即可。

这样就可以舍弃h的首位,将b取h的后m位。

比如CRC-8的h是111010101,b只需是11010101。

3. 每次迭代,受到影响的是gk的前m位,所以构建一个m位的寄存器S,此寄存器储存gk的前m位。

每次迭代计算前先将S的首位抛弃,将寄存器左移一位,同时将gk的后一位加入寄存器。

若使用此种方法,计算步骤如下:※蓝色表示寄存器S的首位,是需要移出的,b根据S的首位选择0或者h。

黄色是需要移入寄存器的位。

S'是经过位移后的S。

2.2查表法同样是上面的那个例子,将数据按每4位组成1个block,这样g就被分成6个block。

下面的表展示了4次迭代计算步骤,灰色背景的位是保存在寄存器中的。

经4次迭代,B1被移出寄存器。

被移出的部分,不是我们关心的,我们关心的是这4次迭代对B2和B3产生了什么影响。

注意表中红色的部分,先作如下定义:B23 = 00111010b1 = 00000000b2 = 01010100b3 = 10101010b4 = 11010101b' = b1 xor b2 xor b3 xor b44次迭代对B2和B3来说,实际上就是让它们与b1,b2,b3,b4做了xor计算,既: B23 xor b1 xor b2 xor b3 xor b4可以证明xor运算满足交换律和结合律,于是:B23 xor b1 xor b2 xor b3 xor b4 = B23 xor (b1 xor b2 xor b3 xor b4) = B23 xor b' = 00111010 ^ 00101011 = 00010001b1是由B1的第1位决定的,b2是由B1迭代1次后的第2位决定(既是由B1的第1和第2位决定),同理,b3和b4都是由B1决定。

通过B1就可以计算出b'。

另外,B1由4位组成,其一共2^4有种可能值。

于是我们就可以想到一种更快捷的算法,事先将b'所有可能的值,16个值可以看成一个表;这样就可以不必进行那4次迭代,而是用B1查表得到b'值,将B1移出,B3移入,与b'计算,然后是下一次迭代。

可看到每次迭代,寄存器中的数据以4位为单位移入和移出,关键是通过寄存器前4位查表获得,这样的算法可以大大提高运算速度。

上面的方法是半字节查表法,另外还有单字节和双字节查表法,原理都是一样的——事先计算出2^8或2^16个b'的可能值,迭代中使用寄存器前8位或16位查表获得b'。

2.3反向算法之前讨论的算法可以称为正向CRC算法,意思是将g左边的位看作是高位,右边的位看作低位。

G的右边加m个0,然后迭代计算是从高位开始,逐步将低位加入到寄存器中。

在实际的数据传送过程中,是一边接收数据,一边计算CRC码,正向算法将新接收的数据看作低位。

逆向算法顾名思义就是将左边的数据看作低位,右边的数据看作高位。

这样的话需要在g的左边加m个0,h也要逆向,例如正向CRC-16算法h=0x4c11db8,逆向CRC-16算法h=0xedb88320。

b的选择0还是h,由寄存器中右边第1位决定,而不是左边第1位。

寄存器仍旧是向左位移,就是说迭代变成从低位到高位。

参数,可以将上次计算的crc结果传入函数中作为这次计算的初始值,这对大数据块的CRC 计算是很有用的,不需要一次将所有数据读入内存,而是读一部分算一次,全读完后就计算完了。

这对内存受限系统还是很有用的。

1.#define POLY 0x10212./*3. * Calculating CRC-16 in 'C'4. * @para addr, start of data5. * @para num, length of data6. * @para crc, incoming CRC7.*/8.uint16_t crc16(unsigned char *addr, int num, uint16_t crc)9.{10.int i;11.for (; num > 0; num--) /* Step through bytes in memory */12. {13. crc = crc ^ (*addr++ << 8); /* Fetch byte from memory, XOR intoCRC top byte*/14.for (i = 0; i < 8; i++) /* Prepare to rotate 8 bits */15. {16.if (crc & 0x8000) /* b15 is set... */17. crc = (crc << 1) ^ POLY; /* rotate and XOR with polynomic*/18.else/* b15 is clear... */19. crc <<= 1; /* just rotate */20. } /* Loop for 8 bits */21. crc &= 0xFFFF; /* Ensure CRC remains 16-bit value */22. } /* Loop until num=0 */23.return(crc); /* Return updated CRC */24.}上面的算法对数据流逐位进行计算,效率很低。

实际上仔细分析CRC计算的数学性质后我们可以多位多位计算,最常用的是一种按字节查表的快速算法。

该算法基于这样一个事实:计算本字节后的CRC码,等于上一字节余式CRC码的低8位左移8位,加上上一字节CRC右移8位和本字节之和后所求得的CRC码。

如果我们把8位二进制序列数的CRC(共256个)全部计算出来,放在一个表里,编码时只要从表中查找对应的值进行处理即可。

按照这个方法,可以有如下的代码:1./*2.crc.h3.*/4.5.#ifndef CRC_H_INCLUDED6.#define CRC_H_INCLUDED7.8./*9.* The CRC parameters. Currently configured for CCITT.10.* Simply modify these to switch to another CRC Standard.11.*/12./*13.#define POLYNOMIAL 0x800514.#define INITIAL_REMAINDER 0x000015.#define FINAL_XOR_VALUE 0x000016.*/17.#define POLYNOMIAL 0x102118.#define INITIAL_REMAINDER 0xFFFF19.#define FINAL_XOR_VALUE 0x000020.21./*22.#define POLYNOMIAL 0x102123.#define POLYNOMIAL 0xA00124.#define INITIAL_REMAINDER 0xFFFF25.#define FINAL_XOR_VALUE 0x000026.*/27.28./*29.* The width of the CRC calculation and result.30.* Modify the typedef for an 8 or 32-bit CRC standard.31.*/32.typedef unsigned short width_t;33.#define WIDTH (8 * sizeof(width_t))34.#define TOPBIT (1 << (WIDTH - 1))35.36./**37. * Initialize the CRC lookup table.38. * This table is used by crcCompute() to make CRC computation faster.39. */40.void crcInit(void);41.42./**43. * Compute the CRC checksum of a binary message block.44. * @para message, 用来计算的数据45. * @para nBytes, 数据的长度46. * @note This function expects that crcInit() has been called47. * first to initialize the CRC lookup table.48. */49.width_t crcCompute(unsigned char * message, unsigned int nBytes);50.51.#endif // CRC_H_INCLUDED1./*2. *crc.c3. */4.5.#include "crc.h"6./*7.* An array containing the pre-computed intermediate result for each8.* possible byte of input. This is used to speed up the computation.9.*/10.static width_t crcTable[256];11.12./**13. * Initialize the CRC lookup table.14. * This table is used by crcCompute() to make CRC computation faster.15. */16.void crcInit(void)17.{18. width_t remainder;19. width_t dividend;20.int bit;21./* Perform binary long division, a bit at a time. */22.for(dividend = 0; dividend < 256; dividend++)23. {24./* Initialize the remainder. */25. remainder = dividend << (WIDTH - 8);26./* Shift and XOR with the polynomial. */27.for(bit = 0; bit < 8; bit++)28. {29./* Try to divide the current data bit. */30.if(remainder & TOPBIT)31. {32. remainder = (remainder << 1) ^ POLYNOMIAL;33. }34.else35. {36. remainder = remainder << 1;37. }38. }39./* Save the result in the table. */40. crcTable[dividend] = remainder;41. }42.} /* crcInit() */43.44./**45. * Compute the CRC checksum of a binary message block.46. * @para message, 用来计算的数据47. * @para nBytes, 数据的长度48. * @note This function expects that crcInit() has been called49. * first to initialize the CRC lookup table.50. */51.width_t crcCompute(unsigned char * message, unsigned int nBytes)52.{53. unsigned int offset;54. unsigned char byte;55. width_t remainder = INITIAL_REMAINDER;56./* Divide the message by the polynomial, a byte at a time. */57.for( offset = 0; offset < nBytes; offset++)58. {59. byte = (remainder >> (WIDTH - 8)) ^ message[offset];60. remainder = crcTable[byte] ^ (remainder << 8);61. }62./* The final remainder is the CRC result. */63.return (remainder ^ FINAL_XOR_VALUE);64.} /* crcCompute() */1.uint crctable[]={ //CRC计算用表2. 0x0000,0xC0C1,0xC181,0x0140,0xC301,0x03C0,0x0280,0xC241,3. 0xC601,0x06C0,0x0780,0xC741,0x0500,0xC5C1,0xC481,0x0440,4. 0xCC01,0x0CC0,0x0D80,0xCD41,0x0F00,0xCFC1,0xCE81,0x0E40,5. 0x0A00,0xCAC1,0xCB81,0x0B40,0xC901,0x09C0,0x0880,0xC841,6. 0xD801,0x18C0,0x1980,0xD941,0x1B00,0xDBC1,0xDA81,0x1A40,7. 0x1E00,0xDEC1,0xDF81,0x1F40,0xDD01,0x1DC0,0x1C80,0xDC41,8. 0x1400,0xD4C1,0xD581,0x1540,0xD701,0x17C0,0x1680,0xD641,9. 0xD201,0x12C0,0x1380,0xD341,0x1100,0xD1C1,0xD081,0x1040,10. 0xF001,0x30C0,0x3180,0xF141,0x3300,0xF3C1,0xF281,0x3240,11. 0x3600,0xF6C1,0xF781,0x3740,0xF501,0x35C0,0x3480,0xF441,12. 0x3C00,0xFCC1,0xFD81,0x3D40,0xFF01,0x3FC0,0x3E80,0xFE41,13. 0xFA01,0x3AC0,0x3B80,0xFB41,0x3900,0xF9C1,0xF881,0x3840,14. 0x2800,0xE8C1,0xE981,0x2940,0xEB01,0x2BC0,0x2A80,0xEA41,15. 0xEE01,0x2EC0,0x2F80,0xEF41,0x2D00,0xEDC1,0xEC81,0x2C40,16. 0xE401,0x24C0,0x2580,0xE541,0x2700,0xE7C1,0xE681,0x2640,17. 0x2200,0xE2C1,0xE381,0x2340,0xE101,0x21C0,0x2080,0xE041,18. 0xA001,0x60C0,0x6180,0xA141,0x6300,0xA3C1,0xA281,0x6240,19. 0x6600,0xA6C1,0xA781,0x6740,0xA501,0x65C0,0x6480,0xA441,20. 0x6C00,0xACC1,0xAD81,0x6D40,0xAF01,0x6FC0,0x6E80,0xAE41,21. 0xAA01,0x6AC0,0x6B80,0xAB41,0x6900,0xA9C1,0xA881,0x6840,22. 0x7800,0xB8C1,0xB981,0x7940,0xBB01,0x7BC0,0x7A80,0xBA41,23. 0xBE01,0x7EC0,0x7F80,0xBF41,0x7D00,0xBDC1,0xBC81,0x7C40,24. 0xB401,0x74C0,0x7580,0xB541,0x7700,0xB7C1,0xB681,0x7640,25. 0x7200,0xB2C1,0xB381,0x7340,0xB101,0x71C0,0x7080,0xB041,26. 0x5000,0x90C1,0x9181,0x5140,0x9301,0x53C0,0x5280,0x9241,27. 0x9601,0x56C0,0x5780,0x9741,0x5500,0x95C1,0x9481,0x5440,28. 0x9C01,0x5CC0,0x5D80,0x9D41,0x5F00,0x9FC1,0x9E81,0x5E40,29. 0x5A00,0x9AC1,0x9B81,0x5B40,0x9901,0x59C0,0x5880,0x9841,30. 0x8801,0x48C0,0x4980,0x8941,0x4B00,0x8BC1,0x8A81,0x4A40,31. 0x4E00,0x8EC1,0x8F81,0x4F40,0x8D01,0x4DC0,0x4C80,0x8C41,32. 0x4400,0x84C1,0x8581,0x4540,0x8701,0x47C0,0x4680,0x8641,33. 0x8201,0x42C0,0x4380,0x8341,0x4100,0x81C1,0x8081,0x404034.};。

相关文档
最新文档