CRC工作原理及算法研究
crc循环冗余码计算
crc循环冗余码计算CRC(循环冗余码)是一种常用于错误检测的编码技术。
它通过对数据进行计算,并附加一个校验码,以便在数据传输过程中检测出错误。
本文将介绍CRC的原理、计算方法以及应用领域。
一、CRC的原理CRC是一种循环冗余校验码,它的原理是通过对数据进行除法运算来生成校验码。
具体步骤如下:1. 首先,选择一个生成多项式G(通常用二进制表示),并确定校验码的位数(通常和G的次数相同)。
2. 将数据进行左移,使其比G的次数多一位,然后用G来除这个左移后的数据,得到余数。
3. 将这个余数附加到原始数据的末尾,得到带有校验码的数据。
二、CRC的计算方法CRC的计算方法比较简单,可以通过以下步骤进行:1. 将数据转换为二进制形式。
2. 在数据末尾添加若干个0,位数等于校验码的位数。
3. 用生成多项式G来除这个新的数据,得到余数。
4. 将这个余数附加到原始数据的末尾,得到带有校验码的数据。
三、CRC的应用领域CRC广泛应用于数据通信和存储领域,常见的应用包括:1. 网络通信:在网络通信中,CRC被用于验证数据包的完整性,以确保数据的准确传输。
2. 存储介质:在硬盘、闪存等存储介质中,CRC被用于检测和纠正数据的错误。
3. 无线电通信:在无线电通信中,CRC可用于验证无线电信号的完整性,以提高通信质量。
4. 数据校验:在数据传输过程中,CRC可以用于检测是否出现了错误或数据损坏。
四、CRC的优势和不足CRC具有以下优势:1. 算法简单:CRC的计算方法相对简单,可以快速计算校验码。
2. 高效性:CRC能够检测多种错误类型,包括单比特错误、多比特错误以及奇偶位错误。
3. 可靠性:CRC的位数越多,检测错误的能力越强,提高了数据传输的可靠性。
然而,CRC也存在一些不足之处:1. 无法纠正错误:CRC只能检测错误,无法纠正数据中的错误。
2. 传输效率: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算法原理
CRC算法原理一、通讯校检在一个p位二进制数据序列之后附加一个r位二进制校检码,构成一个总长为p+r的二进制序列。
附加在数据序列之后的这个校检码与p位二进制序列之间存在一个特定的关系,如果因干扰等原因使得数据序列中的一些位发生错误,这种特性的关系就会破坏。
因此,可以通过检查该关系,实现对接收到的数据正确性的检验。
根据校检码与p位二进制序列之间的关系,可以将通讯校检方式分为:a. 奇偶校检:每个字节的校检码与该字节(包括校检码)中1的个数对应;b. 累加和校检:每个数据包的校检码为该数据包中所有数据忽略进位的累加和;c. CRC-xx校检:每个二进制序列的校检码为该序列与所选择的GF(2)多项式模2除法的余数。
奇偶校验检测错误概率大约为50%,简单但传输效率低。
奇偶校验多用于低速度数据通讯,如RS232。
累加和校验检测错误概率大概为1/256,实现简单,也被广泛的采用。
CRC校检,只要选择的除数GF(2)多项式位数足够多,检测错误的概率几乎不存在。
二、 CRC算法背景1. 几个基本的概念1) 帧检测序列FCS(Frame CheckSequence):为进行差错检验而添加的冗余码。
2) 多项式模2除法:不考虑进位、错位的二进制加减法;3) 生成多项式:当进行CRC检验时,发送方和接受方事先约定一个除数,即生成多项式G(x),常用的CRC码的生成多项式为:CRC8=X8+X5+X4+1CRC-CCITT=X16+X12+X5+1CRC16=X16+X15+X5+1CRC12=X12+X11+X3+X2+1CRC32=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+1每一个生成二项式与一个二进制序列对应,如CC8对应的二进制序列为:100110001。
2. CRC校检码的计算设信息字段为K位,校验字段为R位,则码字长度为N(N=K+R)。
设双方事先约定了一个R次多项式g(x),则CRC码:V(x)=A(x)g(x)=xRm(x)+r(x)其中: m(x)为K次信息多项式, r(x)为R-1次校验多项式。
crc计算方法
crc计算方法CRC是循环冗余校验(Cyclic Redundancy Check)的简称,用于数据通信中检测数据传输中的错误。
其具有检验速度快、检验精度高等特点,因此广泛应用于各种通信协议中。
以下就是CRC计算方法的详细介绍。
1. CRC原理CRC校验采用除法运算和模2余数运算的方法,利用生成多项式G对数据进行校验,生成多项式G和数据D的长度一致,生成多项式G的最高次项系数为1,其余系数均为0。
在进行CRC校验时,需要将数据D在末尾填充一定位数的“0”,使其长度与生成多项式G一致。
然后将填充后的数据D除以生成多项式G,得到余数R,将余数R附加到输入数据D的末尾,形成校验码,发送至对方,对方接收到数据后也进行CRC校验,若余数R为0,则说明数据传输无误,否则说明数据传输存在错误。
2. CRC计算步骤(1)选择生成多项式G:生成多项式G的选择有多种方法,通常情况下会采用标准的CRC校验生成多项式,如CCITT标准的生成多项式为G(x)=x^16+x^12+x^5+1。
(2)将数据D在末尾补充r位“0”,其中r为生成多项式G的次数减一。
例如,若生成多项式G为x^16+x^12+x^5+1,则需要在数据D的末尾补充16+12+5=33位“0”。
(3)将填充后的数据D和生成多项式G转换为二进制,并将填充后的数据D 看作一个多项式。
(4)将生成多项式G左移至与数据D的最高位对齐,然后进行异或(XOR)运算。
(5)将异或后的结果右移一位,并将余数的最高位填充为0。
(6)重复上述步骤,直到生成多项式G无法再左移。
(7)将最终得到的余数R附加到输入数据D的末尾,形成校验码。
3. 示例以下示例采用16位的CRC校验生成多项式G(x)=x^16+x^12+x^5+1。
(1)假设输入数据D为0x1234(即0001001000110100)。
(2)将数据D末尾补充16+12+5=33位“0”,即D=000100100011010000000000000000000。
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的基本原理是将需要传输或存储的数据看作一个二进制数,并且通过一个除数来进行除法运算。
除数通常是一个多项式,在计算上被视为一个二进制数。
除法运算中,被除数通过一系列的异或运算和左移操作与除数进行计算。
最后,得到的余数作为校验码被附加到原始数据的末尾。
下面是CRC的基本计算过程:1.首先,选择一个合适的除数(CRC多项式),通常用一个二进制数表示。
除数的位数决定了校验码的位数和校验能力。
2.将数据看作一个二进制数,并在数据的末尾添加n个0,其中n是除数的位数减1,例如,如果除数是8位,则在数据的末尾添加7个0。
这个过程通常称为填充。
3.将填充后的数据放入循环移位寄存器(CRC寄存器),该寄存器有一个初始值,在计算过程中会不断更新。
4.从左向右,逐位地将数据与除数进行异或运算。
如果数据的当前位为1,则执行异或运算,否则,继续下一位。
5.使用左移操作,将得到的结果作为新的数据放入寄存器。
寄存器的最高位将被丢失,然后在最低位补0。
6.重复第4和第5步,直到所有数据都被处理完毕。
7.最后,将循环移位寄存器中的值作为校验码附加到原始数据的末尾。
在接收方,使用相同的除数和计算过程来计算接收到的数据的校验码。
如果接收到的数据没有被篡改,那么计算出的校验码应该与接收到的校验码完全一致。
如果两个校验码不同,则表示数据被错误地传输或存储。
在CRC中,选择合适的除数十分重要。
不同的除数具有不同的校验能力和错误检测率。
常用的CRC算法包括CRC-8、CRC-16和CRC-32等。
除数的选择一般是根据需求和实际应用来决定的。
1.高效性:CRC算法的计算过程非常简单和高效,可以在硬件或软件中快速实现。
2.可靠性:CRC能够检测出广泛的错误类型,包括单位错误、传输错误和存储错误等。
CRC算法及工作原理
CRC算法及工作原理
CRC(Cyclic Redundancy Check,循环冗余校验)是一种用于确认数
据传输中是否出现错误的算法,它能够接收来自发送端的数据,计算出信
息校验码,之后比对接收端的计算结果,以此来验证数据是否准确传输。
CRC算法是一种基于位运算的多项式编码算法,它将发送方的原始报
文划分为若干数据段,每一段都与一个多项式相匹配生成一个校验和,此
校验和将会附加到报文中发送出去,接收端在接收到后,重新计算报文中
的校验和,并且与报文中的校验和相比较,确认是否发生了错误,以此来
判断数据的正确性。
第一步:根据发送报文的长度,将原始报文划分为若干位数的段,例
如报文长度为128位,将其划分为8段,每段16位;
第二步:为每段数据指定一个多项式,例如多项式“1100”;
第三步:进行异或运算,将每段的数据与指定的多项式进行异或运算,得到校验和;
第四步:将校验和和原始报文拼接在一起,形成最终发送的带校验和
的报文;
第五步:接收方接收到带校验和的报文后,重新用和发送方使用相同
的划分方法将其划分成相同长度的段,每一段与指定的多项式进行异或运算,得到新的校验和;。
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)=x4+x3+x+1,可转换为二进制数码11011。
而发送信息位 1111,可转换为数据多项式为C(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 11101000 131 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 110 00000000000101图9 常用的生成多项式3、模2除(按位除)模2除做法与算术除法类似,但每一位除(减)的结果不影响其它位,即不向上一位借位。
crc_calcblockcrc校验原理
CRC(Cyclic Redundancy Check)是一种数据传输中常用的校验方法,用于检测数据传输过程中可能出现的错误。
CRC校验原理简单而实用,广泛应用于各种通信协议中,包括以太网、USB、蓝牙等。
本文将从CRC的概念、原理和计算方法三个方面来详细介绍CRC校验的相关知识。
一、CRC的概念1. CRC的定义CRC是一种通过对数据进行运算得到一个固定长度的校验值,然后将这个校验值附加在数据后面进行传输的技术。
接收端在接收到数据后,也对数据进行CRC校验,并将得到的校验值与接收到的校验值进行比较,从而判断数据是否在传输过程中发生了错误。
2. CRC的特点CRC校验具有以下特点:(1)高效性:CRC校验采用多项式运算的方法,计算速度快,适合于高速数据传输。
(2)可靠性:CRC校验方法能够检测大部分错误,特别是位错误。
(3)灵活性:CRC校验的位数可以根据需求进行选择,通常为16位或32位。
(4)简单性:CRC校验算法简单,易于实现。
以上特点使得CRC校验在数据通信领域得到了广泛的应用。
二、CRC的原理1. CRC生成多项式CRC校验的关键在于选择合适的生成多项式。
生成多项式通常是一个二进制数,通常是一个不可约多项式。
生成多项式的选择对CRC校验的性能有较大影响,一般情况下,生成多项式的次数越高,CRC校验的可靠性越好。
2. CRC校验过程CRC校验的具体过程如下:(1)初始化:需要在数据的末尾附加上一个初始值,通常为0。
(2)生成余数:将数据与生成多项式进行模2除法运算,得到余数。
(3)得到校验值:将余数附加在原始数据的末尾,得到校验值。
3. CRC校验的原理CRC校验的原理可以简要概括为:发送端在发送数据时,利用生成多项式对数据进行计算,得到一个校验值,然后将这个校验值附加在数据末尾进行传输;接收端在接收到数据后,同样利用生成多项式对数据进行计算,得到一个校验值,然后将这个校验值与接收到的校验值进行比较,若两者一致,则数据传输没有发生错误。
crc的并行实现原理
crc的并行实现原理
CRC(循环冗余校验)是一种常用的数据校验算法,用于检测和纠正传输过程中可能发生的错误。
CRC的并行实现原理主要是通过使用位级操作和并行计算来提高效率。
CRC的核心思想是通过生成多项式对数据进行除法运算,将余数作为校验码附加到原始数据中。
在并行实现中,可以使用并行计算的方式来加速这个除法运算过程。
具体的并行实现原理如下:
1. 将待校验的数据划分为多个字节或比特。
每个字节或比特可以独立进行计算,以提高并行计算的效率。
2. 将生成多项式表示为一个二进制数,并将其转换为一个位级多项式。
该多项式通常表示为一个二进制数,例如CRC-32所使用的生成多项式为0x04C11DB7,表示为一个位级多项式为x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1。
3. 对于每个字节或比特,执行以下步骤:
a. 将字节或比特与校验寄存器进行异或运算。
b. 如果最高位为1,则将校验寄存器左移一位,并与生成多项式进行异或运算。
c. 如果最高位为0,则将校验寄存器左移一位,不做任何异或操作。
4. 重复步骤3,直到所有字节或比特都处理完毕。
5. 最终的校验寄存器的值就是CRC校验码。
通过并行实现,可以同时对多个字节或比特进行校验计算,从而提高了校验的效率。
但需要注意的是,并行实现可能会增加硬件资源的需求,需要根据具体情况选择合适的实现方式。
CRC检验原理及程序实现
CRC检验原理及程序实现CRC(Cyclic Redundancy Check)是一种错误检测技术,通过对数据进行计算得到一个校验码,然后将该校验码传输给接收方,接收方通过对接收到的数据再次进行计算,将计算得到的校验码与接收到的校验码进行比较,以检测数据是否发生错误。
CRC的原理是将数据转换成多项式,并对该多项式进行除法运算。
CRC校验有很多种不同的算法,其中最常用的是CRC-32算法,它基于二进制多项式x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1 CRC算法的具体实现步骤如下:1.初始化一个寄存器,该寄存器的初始值为预设的除数。
2.将数据的第一位与该寄存器的最高位进行异或运算,然后将寄存器向左移一位。
3.如果寄存器最高位是1,则将该寄存器与预设的除数进行异或运算;如果寄存器最高位是0,则继续将寄存器向左移一位。
4.重复步骤2和步骤3,直到计算完整个数据。
5.最后得到的寄存器的值即为CRC校验码。
以下是一个C++程序的示例,实现了CRC-32校验算法:```cpp#include <iostream>#include <string>unsigned long crc32(const std::string& data)unsigned long crc = 0xFFFFFFFF; // 初始化寄存器为32个1 int length = data.length(;for (int i = 0; i < length; ++i)crc ^= data[i]; // 异或运算for (int j = 0; j < 8; ++j)if (crc & 0x01) { // 最高位是1} else { // 最高位是0crc >>= 1; // 左移一位}}}crc ^= 0xFFFFFFFF; // 取反return crc;int maistd::string data = "Hello, world!";unsigned long crc = crc32(data);std::cout << "CRC-32: " << std::hex << crc << std::endl; return 0;```在该程序中,crc32函数使用了一个32位的无符号整型变量crc作为寄存器,通过一个for循环遍历数据的每一位,使用异或运算和移位操作来计算CRC校验码。
CRC基本原理和计算方式
CRC基本原理和计算方式循环冗余校验(CRC)背景循环冗余校验码(CRC) 是在数字数据的生成、传输、处理或存储过程中用于错误检测的最广泛使用的代码之一。
简单来说,CRC 码在传输、处理和数据静止期间保持数据的完整性。
为了使用 CRC 进行错误检测,输入流除以标准多项式,称为特定CRC 标准的“生成多项式”。
此除法过程中的余数称为输入数据的 CRC 码。
在传输或存储数据之前,该剩余部分与原始数据相连。
在接收器处,传输的数据(原始数据及其CRC)再次除以相同的生成多项式。
如果在传输或存储期间没有引入错误,则该除法的余数应为零。
循环冗余码最常用于检测突发错误。
CRC 经常使用,因为它们易于设计并且能够检测大量错误。
特定 CRC 代码能够检测到的错误类型取决于其生成多项式。
可以使用循环冗余校验码检测以下类型的错误:所有单位或两位错误。
所有奇数位错误。
所有突发错误,其中突发大小小于或等于生成多项式的次数。
CRC 数学原理宏观的角度看一下校验过程,如下图所示,带有CRC校验的数据格式为数据+添加项,我们把发送的总数据位记作N,消息位(Message bits)记作k,添加项位数(Appended bits)记作n,即N-k=n,也就是常说的二进制 (N, k) CRC 码。
若用多项式表示,如下:根据上面描述的CRC code bits 的计算方式,消息位(Message bits)也就是你要发的实际数据位是已知的,所需要计算的就是添加项(即多项式R(x)),这就需要n阶生成多项式g(x)(用二进制表示是n+1位)将除以 g(X)(模 2 除法)得到余数,即 R(X),注意R(x)是n-1阶,用二进制表示是n位数据。
之所以要把m(x)乘以X的n阶,是为了把要发的数据向左移n位,给计算的添加项“挪位置”。
因为本身的n位二进制添加项是要加到消息(Message)后面的。
计算R(X)举例:那么,,添加项为0110(n=4),即发送的数据为:111001100110校验正确举例:接收码字的多项式 T(X) 除以生成多项式 g(X)设接收端接收到的带CRC的据111001100110即T(X)除以g(x)余项为0,所以校验正确校验错误举例传输的带有CRC校验的数据:111001100110接收的带有CRC校验的数据:110011100110可得余项为x,即添加项为0010不为0000,校验出错,证明接收的数据有误。
CRC码计算及校验原理计算
CRC码计算及校验原理计算
CRC(Cyclic Redundancy Check)码是一种常用的错误检测码,用于验证数据在传输过程中是否发生错误。
CRC码的计算和校验原理是通过生成多项式对数据进行计算和校验。
以下是CRC码计算及校验原理的详细解释。
一、CRC码的计算原理:
1.选择一个生成多项式G(x),比如G(x)=x^3+x^2+1
2.假设要发送的数据为D(x),将D(x)乘以x的次数等于生成多项式的次数再取模,得到一个除数。
3.将除数与G(x)进行异或运算,产生余数。
4.将余数拼接到原始数据D(x)的后面,得到新的数据N(x)。
5.将数据N(x)进行发送。
二、CRC码的校验原理:
1.接收到数据N(x)后,用生成多项式G(x)去除以接收的数据N(x)。
2.如果除数为0,则认为数据没有发生错误,否则则认为数据发生了错误。
举例说明:
1.计算步骤:
2.校验步骤:
-用生成多项式G(x)去除以接收的数据N(x),得到商和余数。
-如果余数为0,说明数据没有发生错误,否则说明数据发生了错误。
通过以上计算和校验步骤,可以判断数据在传输过程中是否发生错误。
CRC码的优点是简单、效率高,能够检测到大部分错误,被广泛应用
在通信、存储等领域。
然而,CRC码只能检测错误,不能纠正错误。
当数
据发生错误时,需要重新发送数据或通过其他方法进行纠错处理。
CRC算法原理
CRC算法原理经过两天的学习,理解了CRC的原理及实现方法,记录于此备日后使用。
(本文所有的运算,位数等讨论均是基于二进制的)CRC是Cyclic Redundancy Check的缩写,其中文翻译是循环冗余校验,该算法在通信及数字存储领域被广泛使用。
以下引用维基百科中对CRC的定义:CRC为校验和的一种,是两个字节数据流采用二进制除法(没有进位,使用异或来代替减法)相除所得到的余数。
其中被除数是需要计算校验和的信息数据流的二进制表示;除数是一个长度为n + 1的预定义(短)的二进制数,通常用多项式的系数来表示。
在做除法之前,要在信息数据之后先加上n个0.用通俗的话讲CRC的校验过程就是将待校验的数据也就是我们需要存储或者发送的信息看做一个有限长的二进制数A,然后选择一个除数B,通过定义的一种CRC除法运算求得A/B的余数,这个余数也就是我们需要求的CRC校验和。
在进一步了解CRC算法之前我们需要知道三个CRC的基本概念。
1.CRC的位宽根据余数的二进制位数不同我们又将CRC算法用CRC-N来表示,N就表示算法的余数位数,这个位数就是CRC算法的位宽。
目前被广泛应用余数位数N有16和32两种。
2.除数的选择CRC位宽确定之后,我们就需要确定除数了。
由原来已有的数学知识我们就已经知道余数和除数存在一定的关系——余数要小于除数。
CRC算法的求余数过程不是我们认识的严格意义的除法运算,我们对除数和余数的关系进行如下定义:假设余数位数为N,则除数位宽应该为N+1。
为什么需要这样的定义,我们可以从后文的CRC除法运算过程找到答案。
(位宽的计算方式为:假设二进制序列最低位位置序号记为1,高位位置序号递增,则最高不为0位的位置序号称为该二进制序列的位宽。
)3.补零操作CRC计算过程中为了让每一个原始信息都能够参与余数计算我们需要对原来的信息添加N个0到信息末尾。
这个操作我们称之为补零操作。
4.CRC除法运算CRC除法运算实际上就是不计进位的模2除法计算过程,逻辑上表现为位和位之间的异或运算。
CRC16算法原理
CRC算法及C实现学习体会 2008-09-20 15:21:13 阅读161 评论0 字号:大中小 订阅一、CRC算法原理CRC校验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校 验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去。
在接收端,则根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。
16位的CRC码产生的规则是先将要发送的二进制序列数左移16位(既乘以 )后,再除以一个多项式,最后所得到的余数既是CRC码。
假设数据传输过程中需要发送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等。
国际通行标准可以参看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后直接跳到后面的非零位。
crc校验原理
crc校验原理
CRC校验,即循环冗余校验,是一种常用的数据错误检测技术。
它通过一个多项式,将传输的信息和多项式的结果相关联起来,形成校验和,并将校验和一并发送出去。
接收到传输信息时,计算收到信息和校验和的多项式,看是否与发送时计算出的校验和一致,如果不一致,则说明数据传输过程中出现错误。
CRC校验的原理由三部分组成:一是多项式的选择,二是移位计算,三是异或运算。
1、多项式的选择:CRC校验需要使用一个特定的多项式,用这个多项式来表示传输信息中所包含的位,以便实现校验计算。
2、移位计算:CRC校验以比特为单位进行计算,发送者采用移位运算,把需要传输的信息放到多项式中,并且依次将其向右移动,与多项式相乘,得出结果。
3、异或运算:CRC校验在计算过程中,与多项式的乘法运算结合异或运算,异或运算的计算结果是1的话,就将结果置1,如果结果是0的话,就将结果置0,把结果做为校验和,同时发送出去。
CRC工作原理及算法研究
CRC工作原理及算法研究在数字通信系统中可靠与快速往往是一对矛盾。
若要求快速,则必然使得每个数据码元所占地时间缩短、波形变窄、能量减少,从而在受到干扰后产生错误地可能性增加,传送信息地可靠性下降。
若是要求可靠,则使得传送消息地速率变慢。
因此,如何合理地解决可靠性也速度这一对矛盾,是正确设计一个通信系统地关键问题之一。
为保证传输过程的正确性,需要对通信过程进行差错控制。
差错控制最常用的方法是自动请求重发方式(ARQ)、向前纠错方式(FEC)和混合纠错(HEC)。
在传输过程误码率比较低时,用FEC方式比较理想。
在传输过程误码率较高时,采用FEC容易出现“乱纠”现象。
HEC方式则式ARQ和FEC 的结合。
在许多数字通信中,广泛采用ARQ方式,此时的差错控制只需要检错功能。
实现检错功能的差错控制方法很多,传统的有:奇偶校验、校验和检测、重复码校验、恒比码校验、行列冗余码校验等,这些方法都是增加数据的冗余量,将校验码和数据一起发送到接受端。
接受端对接受到的数据进行相同校验,再将得到的校验码和接受到的校验码比较,如果二者一致则认为传输正确。
但这些方法都有各自的缺点,误判的概率比较高。
循环冗余校验CRC(Cyclic Redundancy Check)是由分组线性码的分支而来,其主要应用是二元码组。
编码简单且误判概率很低,在通信系统中得到了广泛的应用。
下面重点介绍了CRC校验的原理及其 算法实现。
一、循环冗余校验码(CRC)CRC校验采用多项式编码方法。
被处理的数据块可以看作是一个n阶的二进制多项式,由。
如一个8位二进制数10110101可以表示为:。
多项式乘除法运算过程与普通代数多项式的乘除法相同。
多项式的加减法运算以2为模,加减时不进,错位,和逻辑异或运算一致。
采用CRC校验时,发送方和接收方用同一个生成多项式g(x),并且g(x)的首位和最后一位的系数必须为1。
CRC的处理方法是:发送方以g(x)去除t(x),得到余数作为CRC校验码。
CRC算法及工作原理.
CRC算法及工作原理CRC检验CRC校验实用程序库在数据存储和数据通讯领域,为了保证数据的正确,就不得不采用检错的手段。
在诸多检错手段中,CRC是最著名的一种。
CRC 的全称是循环冗余校验,其特点是:检错能力极强,开销小,易于用编码器及检测电路实现。
从其检错能力来看,它所不能发现的错误的几率仅为0.0047%以下。
从性能上和开销上考虑,均远远优于奇偶校验及算术和校验等方式。
因而,在数据存储和数据通讯领域,CRC无处不在:著名的通讯协议X.25的FCRC检验CRC校验实用程序库在数据存储和数据通讯领域,为了保证数据的正确,就不得不采用检错的手段。
在诸多检错手段中,CRC是最著名的一种。
CRC的全称是循环冗余校验,其特点是:检错能力极强,开销小,易于用编码器及检测电路实现。
从其检错能力来看,它所不能发现的错误的几率仅为0.0047%以下。
从性能上和开销上考虑,均远远优于奇偶校验及算术和校验等方式。
因而,在数据存储和数据通讯领域,CRC无处不在:著名的通讯协议X.25的FCS(帧检错序列)采用的是CRC-CCITT,WinRAR、NERO、ARJ、LHA等压缩工具软件采用的是CRC32,磁盘驱动器的读写采用了CRC16,通用的图像存储格式GIF、TIFF等也都用CRC作为检错手段。
CRC的本质是模-2除法的余数,采用的除数不同,CRC的类型也就不一样。
通常,CRC的除数用生成多项式来表示。
最常用的CRC码的生成多项式如表1所示。
@@10A08800.GIF;表1.最常用的CRC码及生成多项式@@由于CRC在通讯和数据处理软件中经常采用,笔者在实际工作中对其算法进行了研究和比较,总结并编写了一个具有最高效率的CRC通用程序库。
该程序采用查表法计算CRC,在速度上优于一般的直接模仿硬件的算法,可以应用于通讯和数据压缩程序。
算法通常的CRC算法在计算一个数据段的CRC值时,其CRC值是由求解每个数值的CRC值的和对CRC寄存器的值反复更新而得到的。
CRC计算方法
1. CRC校验原理CRC校验原理看起来比较复杂,好难懂,因为大多数书上基本上是以二进制的多项式形式来说明的。
其实很简单的问题,其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。
当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)。
到达接收端后,再把接收到的新帧除以(同样采用“模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,也无进位,无借位。
相当于二进制中的逻辑异或运算。
也就是比较后,两者对应位相同则结果为“0”,不同则结果为“1”。
如100101除以1110,结果得到商为11,余数为1,如图5-9左图所示。
如11×11=101,如图5-9右图所示。
图5-9 “模2除法”和“模2乘法”示例具体来说,CRC校验原理就是以下几个步骤:(1)先选择(可以随机选择,也可按标准选择,具体在后面介绍)一个用于在接收端进行校验时,对接收的帧进行除法运算的除数(是二进制比较特串,通常是以多项方式表示,所以CRC又称多项式编码方法,这个多项式也称之为“生成多项式”)。
(2)看所选定的除数二进制位数(假设为k位),然后在要发送的数据帧(假设为m位)后面加上k-1位“0”,然后以这个加了k-1个“0“的新帧(一共是m+k-1位)以“模2除法”方式除以上面这个除数,所得到的余数(也是二进制的比特串)就是该帧的CRC校验码,也称之为FCS(帧校验序列)。
crc 原理
CRC原理详解1. 引言循环冗余检验(Cyclic Redundancy Check,CRC)是一种常用的错误检测技术,广泛应用于通信、存储等领域。
CRC通过对数据进行多项式计算,生成冗余校验码,并将其附加到数据中。
接收方在接收到数据后,使用相同的多项式计算方法对数据进行校验,如果校验结果与接收到的冗余校验码一致,说明数据未被错误修改;否则,说明数据可能存在错误。
本文将详细介绍CRC的基本原理,包括生成多项式、计算过程、校验方法等。
2. 多项式生成CRC通过多项式生成冗余校验码。
生成多项式是一个固定的二进制数,通常用一个二进制数表示,如110101。
生成多项式的选择对CRC的性能有很大影响,不同的生成多项式可以检测到不同数量的错误,并具有不同的误检率。
生成多项式的选取方法有很多种,常用的有标准CRC多项式、反射CRC多项式和非反射CRC多项式。
标准CRC多项式的最高次项为1,如100000111;反射CRC多项式的最高次项为0,如110101;非反射CRC多项式的最高次项为1,如100000111。
3. 计算过程CRC的计算过程可以简单描述为:将数据按照二进制形式进行处理,除以生成多项式并取余数,将余数作为冗余校验码附加到数据中。
具体计算过程如下: 1. 将要发送的数据转换为二进制形式。
2. 在数据的末尾添加n个0,其中n为生成多项式的位数减1。
3. 将数据除以生成多项式,并取余数。
4. 将余数作为冗余校验码附加到数据末尾。
例如,要发送的数据为101010,生成多项式为110101,则计算过程如下: 1. 将数据转换为二进制形式:101010。
2. 在数据末尾添加5个0:10101000000。
3. 将数据除以生成多项式并取余数:10101000000除以110101,余数为01110。
4. 将余数作为冗余校验码附加到数据末尾:10101001110。
最终发送的数据为10101001110。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CRC工作原理及算法研究在数字通信系统中可靠与快速往往是一对矛盾。
若要求快速,则必然使得每个数据码元所占地时间缩短、波形变窄、能量减少,从而在受到干扰后产生错误地可能性增加,传送信息地可靠性下降。
若是要求可靠,则使得传送消息地速率变慢。
因此,如何合理地解决可靠性也速度这一对矛盾,是正确设计一个通信系统地关键问题之一。
为保证传输过程的正确性,需要对通信过程进行差错控制。
差错控制最常用的方法是自动请求重发方式(ARQ)、向前纠错方式(FEC)和混合纠错(HEC)。
在传输过程误码率比较低时,用FEC方式比较理想。
在传输过程误码率较高时,采用FEC容易出现“乱纠”现象。
HEC方式则式ARQ和FEC 的结合。
在许多数字通信中,广泛采用ARQ方式,此时的差错控制只需要检错功能。
实现检错功能的差错控制方法很多,传统的有:奇偶校验、校验和检测、重复码校验、恒比码校验、行列冗余码校验等,这些方法都是增加数据的冗余量,将校验码和数据一起发送到接受端。
接受端对接受到的数据进行相同校验,再将得到的校验码和接受到的校验码比较,如果二者一致则认为传输正确。
但这些方法都有各自的缺点,误判的概率比较高。
循环冗余校验CRC(Cyclic Redundancy Check)是由分组线性码的分支而来,其主要应用是二元码组。
编码简单且误判概率很低,在通信系统中得到了广泛的应用。
下面重点介绍了CRC校验的原理及其 算法实现。
一、循环冗余校验码(CRC)CRC校验采用多项式编码方法。
被处理的数据块可以看作是一个n阶的二进制多项式,由。
如一个8位二进制数10110101可以表示为:。
多项式乘除法运算过程与普通代数多项式的乘除法相同。
多项式的加减法运算以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)= 。
采用16位CRC校验,可以保证在 bit码元中只含有一位未被检测出的错误。
在IBM的同步数据链路控制规程SDLC的帧校验序列FCS 中,使用CRC-16,其生成多项式g(x)= ;而在CCITT推荐的高级数据链路控制规程HDLC的帧校验序列FCS中,使用CCITT-16,其生成多项式g(x)= 。
CRC-32的生成多项式g(x)= 。
CRC-32出错的概率比CRC-16低倍。
由于CRC-32的可靠性,把CRC-32用于重要数据传输十分合适,所以在通信、计算机等领域运用十分广泛。
在一些UART通信控制芯片(如 MC6582、Intel8273和Z80-SIO)内,都采用了CRC校验码进行差错控制;以太网卡芯片、MPEG解码芯片中,也采用CRC-32进行差错控制。
二、 CRC校验码的算法分析CRC校验码的编码方法是用待发送的二进制数据t(x)除以生成多项式g(x),将最后的余数作为CRC校验码。
其实现步骤如下:设待发送的数据块是m位的二进制多项式t(x),生成多项式为r 阶的g(x)。
在数据块的末尾添加r个0,数据块的长度增加到m+r 位,对应的二进制多项式为。
用生成多项式g(x)去除,求得余数为阶数为r-1的二进制多项式y(x)。
此二进制多项式y(x)就是t(x)经过生成多项式g (x)编码的CRC校验码。
用以模2的方式减去y(x),得到二进制多项式。
就是包含了CRC校验码的待发送字符串。
从CRC的编码规则可以看出,CRC编码实际上是将代发送的m位二进制多项式t(x)转换成了可以被g(x)除尽的m+r位二进制多项式,所以解码时可以用接受到的数据去除g(x),如果余数位零,则表示传输过程没有错误;如果余数不为零,则在传输过程中肯定存在错误。
许多CRC的硬件解码电路就是按这种方式进行检错的。
同时可以看做是由t(x)和CRC校验码的组合,所以解码时将接收到的二进制数据去掉尾部的r位数据,得到的就是原始数据。
为了更清楚的了解CRC校验码的编码过程,下面用一个简单的例子来说明CRC校验码的编码过程。
由于CRC-32、CRC-16、CCITT和CRC-4的编码过程基本一致,只有位数和生成多项式不一样。
为了叙述简单,用一个CRC-4编码的例子来说明CRC的编码过程。
设待发送的数据t(x)为12位的二进制数据100100011100;CRC-4的生成多项式为g(x)= ,阶数r为4,即10011。
首先在t(x)的末尾添加4个0构成,数据块就成了1001000111000000。
然后用g (x)去除,不用管商是多少,只需要求得余数y(x)。
下表为给出了除法过程。
除数次数被除数/ g(x)/结果余数0 1 001000111000000 1001110000001 00110 0001001110000001 1 00111000000 10000001 00110 000010000002 1 000000 11001 00110 001100从上面表中可以看出,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,所以有种选择。
上述算法可以描述如下,//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,所以有种选择。
上述算法可以描述如下://reg是一个4 Byte的寄存器初始化t[]={…}//共有=256项把reg中的值置0.把原始的数据后添加r/8个0字节.While (数据未处理完)Begin把reg中的值左移一个字节,读入一个新的字节并置于reg的第0个byte的位置。
reg = reg XOR t[移出的字节]End算法的依据和多项式除法性质有关。
如果一个m位的多项式t(x)除以一个r阶的生成多项式g(x),,将每一位(0=<k<m)提出来,在后面不足r个0后,单独去除g(x),得到的余式位。
则将后得到的就是t(x)由生成多项式g(x)得到的余式。
对于CRC-32,可以将每个字节在后面补上32个0后与生成多项式进行运算,得到余式和此字节唯一对应,这个余式就是上面算法种t[]中的值,由于一个字节有8位,所以t[]共有=256项。
这种算法每次处理一个字节,通过查表法进行运算,大大提高了处理速度,故为大多数应用所采用。
算法通常的CRC算法在计算一个数据段的CRC值时,其CRC值是由求解每个数值的CRC值的和对CRC寄存器的值反复更新而得到的。
这样,求解CRC的速度较慢。
通过对CRC算法的研究,我们发现:一个8位数据加到16位累加器中去,只有累加器的高8位或低8位与数据相作用,其结果仅有256种可能的组合值。
因而,我们可以用查表法来代替反复的运算,这也同样适用于CRC32的计算。
本文所提供的程序库中,函数crchware是一般的16位CRC的算法;mk-crctbl用以在内存中建立一个CRC数值表;crcupdate用以查表并更新CRC累加器的值;crcrevhware和crcrevupdate是反序算法的两个函数;BuildCRCTable、CalculateBlockCRC32和UpdateCharacterCRC32用于CRC32的计算。
/* CRC.C——CRC程序库 */#define CRCCCITT 0x1021#define CCITT-REV 0x8408#define CRC16 0x8005#define CRC16-REV 0xA001#define CRC32-POLYNOMIAL 0xEDB88320L/* 以上为CRC除数的定义 */#define NIL 0#definecrcupdate(d,a,t)*(a)=(*(a)<<8)^(t)[(*(a)>>8)^(d)];#definecrcupdate16(d,a,t)*(a)=(*(a)>>8^(t)[(*(a)^(d))&0x00ff]) /* 以上两个宏可以代替函数crcupdate和crcrevupdate */#include #include #include /* 函数crchware是传统的CRC算法,其返回值即CRC值 */ unsigned shortcrchware(data,genpoly,accum)unsigned short data;/* 输入的数据 */unsigned short genpoly;/* CRC除数 */unsigned short accum;/* CRC累加器值 */{static int i;data<<=8;for(i=8;i>0;i--){if((data^accum)&0x8000)accum=(accum<<1)^genpoly;elseaccum<<=1;data<<=1;}return (accum);}/* 函数mk-crctbl利用函数crchware建立内存中的CRC数值表 */unsigned short *mk-crctbl(poly,crcfn);unsigned short poly;/* CRC除数--CRC生成多项式 */R>unsigned short (*crcfn)();/* 指向CRC函数(例如crchware)的指针 */{/* unsigned short */malloc(); */unsigned short *crctp;int i;if((crctp=(unsignedshort*)malloc(256*sizeof(unsigned)))==0)return 0;for(i=0;i<256;i++)crctp=(*crcfn)(i,poly,0);return crctp;}/* 函数mk-crctbl的使用范例 */if((crctblp=mk-crctbl(CRCCCITT,crchware))==NIL){puts("insuff memory for CRC lookup table.n");return 1; *//* 函数crcupdate用以用查表法计算CRC值并更新CRC累加器值 */void crcupdate(data,accum,crctab)unsigned short data;/* 输入的数据 */unsigned short *accum;/* 指向CRC累加器的指针 */unsigned short *crctab;/* 指向内存中CRC表的指针 */{static short comb-val;comb-val=(*accum>>8)^data;*accum=(*accum<<8)^crctab[comb-val];}/* 函数crcrevhware是传统的CRC算法的反序算法,其返回值即CRC值 */unsigned short crcrevhware(data,genpoly,accum)unsigned short data;unsigned short genpoly;unsigned short accum;{static int i;data<<=1;for(i=8;i>0;i--){data>>=1;if((data^accum)&0x0001)accum=(accum>>1)^genpoly;elseaccum>>=1;}return accum;}/* 函数crcrevupdate用以用反序查表法计算CRC值并更新CRC累加器值 */void crcrevupdate(data,accum,crcrevtab)unsigned short data; unsigned short *accum;。