CR校验——不同的生成多项式对应不同的表

合集下载

标准CRC生成多项式如下表:

标准CRC生成多项式如下表:

标准CRC生成多项式如下表:名称生成多项式简记式* 标准引用CRC-4 x4+x+1 3 ITU G.704CRC-8 x8+x5+x4+1 0x31CRC-8 x8+x2+x1+1 0x07CRC-8 x8+x6+x4+x3+x2+x1 0x5ECRC-12 x12+x11+x3+x+1 80FCRC-16 x16+x15+x2+1 8005 IBM SDLCCRC16-CCITT x16+x12+x5+1 1021 ISO HDLC, ITU X.25, V.34/V.41/V.42,PPP-FCSCRC-32 x32+x26+x23+...+x2+x+1 04C11DB7 ZIP, RAR, IEEE 802 LAN/FDDI, IEEE 1394, PPP-FCSCRC-32c x32+x28+x27+...+x8+x6+1 1EDC6F41 SCTP生成多项式的最高位固定的1,故在简记式中忽略最高位1了,如0x1021实际是0x11021。

I、基本算法(人工笔算):以CRC16-CCITT为例进行说明,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校验码的生成方法

crc校验码的生成方法

crc校验码的生成方法Cyclic Redundancy Check(CRC)校验码是一种在数字通信中检测数据错误的方法。

CRC校验码的生成是通过对数据进行一系列数学运算(异或运算)得到的。

生成CRC校验码的过程包括以下步骤:1. 选择CRC多项式:CRC多项式是CRC算法中的关键部分,它决定了校验码生成的方式。

不同的CRC多项式用于不同的应用场景。

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

每种CRC多项式都由一个二进制数表示。

2. 初始化:将CRC寄存器初始化为一个特定的值,通常为全0。

这个值的选择可能与CRC 多项式有关。

3. 按位处理数据:将待校验的数据按位处理,从最高位到最低位。

对于每一位,执行以下操作:-将CRC寄存器的高位与当前数据位进行异或操作。

-将CRC寄存器左移一位。

4. 处理完所有数据位:经过上述处理后,CRC寄存器中存储的就是生成的CRC校验码。

5. 最终异或:在得到CRC校验码后,通常还需要将其与一个预定的值进行最终的异或操作。

这个预定的值可能是一些预定义的常数,具体取决于CRC的实现。

下面是一个简化的伪代码示例,说明CRC校验码的生成过程:```plaintextfunction generateCRC(data):CRC_POLYNOMIAL = 0xA001 # 16-bit CRC polynomial, for exampleCRC_REGISTER = 0xFFFF # Initial value of CRC registerfor each bit in data:CRC_REGISTER = CRC_REGISTER XOR (bit << 8)for i from 0 to 7:if (CRC_REGISTER AND 0x8000) != 0:CRC_REGISTER = (CRC_REGISTER << 1) XOR CRC_POLYNOMIALelse:CRC_REGISTER = CRC_REGISTER << 1CRC_RESULT = CRC_REGISTER XOR 0xFFFF # Final XOR operationreturn CRC_RESULT```在实际应用中,CRC校验码的生成方法可能会因CRC多项式的不同而有所变化。

CRC校验原理及步骤

CRC校验原理及步骤

CRC校验原理及步骤CRC(Cyclic Redundancy Check)校验是一种常用的错误检测方法,用于验证数据传输过程中是否存在错误。

CRC校验采用生成多项式对数据进行计算,从而生成一个固定长度的冗余校验码,将该校验码附加在数据后面进行传输,接收方利用同样的生成多项式对接收到的数据进行计算,并与接收到的校验码进行比较,如果校验码一致,则认为数据传输没有错误;如果校验码不一致,则认为数据传输存在错误。

1.选择生成多项式:在进行CRC校验前,需要选择一个生成多项式。

常用的生成多项式有:CRC-8,CRC-16,CRC-32等。

根据实际情况选择不同的生成多项式。

2.数据填充:在数据的末尾添加一组"0",长度等于生成多项式的次数加1、例如,如果选择的生成多项式为CRC-8,则在数据末尾填充一组"0",长度为9;如果选择的生成多项式为CRC-16,则在数据末尾填充一组"0",长度为173.生成校验码:利用生成多项式对填充后的数据进行除法运算,计算余数。

余数即为校验码。

通常,余数的位数为生成多项式的次数。

4.将校验码添加到数据中:将生成的校验码添加到数据末尾,并进行传输。

5.接收方计算校验码:接收方接收到数据后,利用接收到的数据和相同的生成多项式进行除法运算,计算余数。

6.比较校验码:接收方得到余数后,将其与接收到的校验码进行比较。

如果两者一致,则认为数据传输没有错误;如果两者不一致,则认为数据传输存在错误。

CRC校验的原理是利用多项式除法运算,将数据作为一个伪多项式进行计算,并得到一个余数。

由于多项式的特性,如果在数据传输过程中出现了错误,那么接收方计算得到的余数一定与发送方生成的校验码不一致。

通过比较余数和校验码,接收方可以判断数据是否传输正确。

1.简单高效:CRC校验算法计算速度快,适用于高速数据传输。

2.安全性高:CRC校验算法能够高效地检测出多种错误,包括单比特错误、双比特错误等。

CRC校验实现的过程说明

CRC校验实现的过程说明

CRC校验实现的过程说明
1.确定生成多项式
在CRC校验中,首先需要确定生成多项式。

生成多项式是一个二进制数,最高位和最低位分别为1,中间可以是任意二进制数。

生成多项式的
不同取值对应着不同的CRC校验算法。

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

2.初始化寄存器
3.数据处理
将待校验的数据按照二进制方式表示,并将每一位依次输入到计算寄
存器。

这样,整个待校验的数据就可以被寄存器包含。

4.CRC计算
通过移位异或的方式进行CRC计算。

移位是将寄存器的所有位向左移
一位,同时将输入位移入最低位。

异或是对于多项式中为1的位,如果寄
存器的对应位为1,则结果为0,否则结果为1、通过多次移位异或操作,直到所有位都处理完毕。

5.输出校验值
当所有位都处理完毕后,寄存器中的值即为校验值。

这个校验值可以
附加在数据传输的末尾。

接收方在接收到数据后,进行相同的校验操作,
如果计算出的校验值与接收到的校验值相同,说明传输过程没有发生错误。

然而,CRC校验也有一些限制。

它只能检测错误的存在,不能提供错
误的位置信息。

此外,CRC校验是一种线性校验方法,无法检测出所有的
双位错误。

综上所述,CRC校验实现的过程是通过生成多项式、初始化寄存器、数据处理、CRC计算和输出校验值来完成的。

它是一种简单、快速和可靠的检错技术,在数据传输中得到广泛应用。

crc16校验查表法原理

crc16校验查表法原理

crc16校验查表法原理CRC(Cyclic Redundancy Check)是一种常用的数据校验方法,广泛应用于数据通信和存储中,以确保数据的完整性和准确性。

CRC校验可以通过查表法来实现,本文将介绍CRC16校验的查表法原理。

在CRC校验中,发送方和接收方通过一系列的计算操作来生成和校验校验码。

其中,CRC16是一种16位的循环冗余校验码,可以检测出多达2个比特的错误。

CRC16校验的查表法是一种基于查表的快速计算方法,通过预先构建一个256个元素的查表来加速校验码的计算。

我们需要准备一个256个元素的查表,每个元素都是一个16位的值。

这个查表可以通过生成多项式来计算得到,CRC16通常使用的是0x8005或0x1021这两个生成多项式。

通过对这两个多项式进行反转和左移操作,我们可以得到一个256个元素的查表。

接下来,我们需要将待校验的数据按照字节进行拆分,并将每个字节和当前的校验码进行异或运算。

异或运算是一种位运算,其运算规则是两个数对应位相同则结果为0,不同则结果为1。

通过不断地进行异或运算,将每个字节和当前的校验码进行异或,最终得到一个16位的校验码。

然后,我们可以通过查表的方式来加速校验码的计算。

对于每个字节,我们可以将它作为查表的索引,查表的结果就是一个16位的值。

然后,我们将这个值和当前的校验码进行异或运算,得到一个新的校验码。

通过不断地查表和异或运算,最终得到的校验码就是CRC16校验码。

CRC16校验的查表法相比于其他计算方法具有高效和简洁的特点。

通过预先构建查表,可以大大减少计算的时间和复杂度。

同时,查表法还可以方便地用于硬件电路的设计和实现,提高系统的性能和可扩展性。

需要注意的是,CRC16校验的查表法并不是唯一的实现方式,还可以使用其他方法来计算校验码。

而且,在实际应用中,不同的通信协议和设备可能会采用不同的CRC算法和生成多项式。

CRC16校验的查表法是一种基于查表的快速计算方法,通过预先构建一个256个元素的查表,可以加速CRC16校验码的计算。

crc校验码详细介绍看懂了就会了

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)*2的R次方,这样C(x)的右边就会空出R位,这就是校验码的位置。

通过C(x)*2的R次方除以生成多项式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码)任何一位发生错误时,被生成多项式做除后应该使余数不为0。

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

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

3 CRC码的生成步骤1、将x的最高次幂为R的生成多项式G(x)转换成对应的R+1位二进制数。

2、将信息码左移R位,相当与对应的信息多项式C(x)*2的R次方。

3、用生成多项式(二进制数)对信息码做除,得到R位的余数。

CRC32校验码算法

CRC32校验码算法
0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,
0xbad03605L, 0xcdd70693L, 0x54de5729L, 0x23d967bfL,
0xb3667a2eL, 0xc4614ab8L, 0x5d681b02L, 0x2a6f2b94L,
0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, 0x2d02ef8dL
0x5005713cL, 0x270241aaL, 0xbe0b1010L, 0xc90c2086L,
0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L,
0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,
0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,

crc逆序表格

crc逆序表格

CRC(循环冗余校验)是一种用于检测数据传输错误的算法。

在CRC中,有一个称为“逆序表格”的概念,它是一种预先计算好的表,用于快速计算CRC校验码。

这个表格包含了固定长度的二进制串对应的CRC值,对于一个给定的生成多项式,可以生成一个唯一的逆序表格。

通过使用这个表,可以在常数时间内查找对应的CRC值,从而提高了计算效率。

逆序表格的生成方法是基于多项式的逆元和模运算的性质。

具体来说,对于一个给定的生成多项式,首先将它转换为二进制形式,然后通过遍历二进制串的所有可能情况来生成表格。

对于每个二进制串,计算其CRC值,并将结果存储在表格中。

最终得到的表格就是逆序表格。

使用逆序表格进行CRC计算时,首先将要校验的数据转换为二进制串,然后通过查找逆序表格找到对应的CRC值。

如果计算得到的CRC值与预存的CRC值相等,则说明数据传输无误;否则,说明数据传输过程中出现了错误。

需要注意的是,逆序表格的生成和存储都需要一定的时间和空间资源。

因此,在实际应用中,需要根据具体情况选择合适的生成多项式和存储方式,以实现高效、准确的CRC校验。

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

标准CRC生成多项式如下表:名称生成多项式简记式* 标准引用CRC-4 x4+x+1 3 ITU G.704CRC-8 x8+x5+x4+1 0x31CRC-8 x8+x2+x1+1 0x07CRC-8 x8+x6+x4+x3+x2+x1 0x5ECRC-12 x12+x11+x3+x+1 80FCRC-16 x16+x15+x2+1 8005 IBM SDLCCRC16-CCITT x16+x12+x5+1 1021 ISO HDLC, ITU X.25, V.34/V.41/V.42,PPP-FCSCRC-32 x32+x26+x23+...+x2+x+1 04C11DB7 ZIP, RAR, IEEE 802 LAN/FDDI, IEEE 1394, PPP-FCSCRC-32c x32+x28+x27+...+x8+x6+1 1EDC6F41 SCTP生成多项式的最高位固定的1,故在简记式中忽略最高位1了,如0x1021实际是0x11021。

I、基本算法(人工笔算):以CRC16-CCITT为例进行说明,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]。

III、计算机算法2(字节型算法):256^n表示256的n次方把按字节排列的数据流表示成数学多项式,设数据流为BYTE[n]BYTE[n-1]BYTE[n-2]、、、BYTE[1]BYTE[0],表示成数学表达式为BYTE[n]×256^n+BYTE[n-1]×256^(n-1)+...+BYTE[1]*256+BYTE[0],在这里+表示为异或运算。

设生成多项式为G17(17bit),CRC码为CRC16。

则,CRC16=(BYTE[n]×256^n+BYTE[n-1]×256^(n-1)+...+BYTE[1]×256+BYTE[0])×256^2/G17,即数据流左移16位,再除以生成多项式G17。

先变换BYTE[n-1]、BYTE[n-1]扩大后的形式,CRC16=BYTE[n]×256^n×256^2/G17+BYTE[n-1]×256^(n-1)×256^2/G17+...+BYTE[1]×256×256^2/G17 +BYTE[0]×256^2/G17=(Z[n]+Y[n]/G17)×256^n+BYTE[n-1]×256^(n-1)×256^2/G17+...+BYTE[1]×256×256^2/G17+BY TE[0]×256^2/G17=Z[n]×256^n+{Y[n]×256/G17+BYTE[n-1]×256^2/G17}×256^(n-1)+...+BYTE[1]×256×256^2/G1 7+BYTE[0]×256^2/G17=Z[n]×256^n+{(YH8[n]×256+YHL[n])×256/G17+BYTE[n-1]×256^2/G17}×256^(n-1)+...+BYTE [1]×256×256^2/G17+BYTE[0]×256^2/G17=Z[n]×256^n+{YHL[n]×256/G17+(YH8[n]+BYTE[n-1])×256^2/G17}×256^(n-1)+...+BYTE[1]×2 56×256^2/G17+BYTE[0]×256^2/G17这样就推导出,BYTE[n-1]字节的CRC校验码为{YHL[n]×256/G17+(YH8[n]+BYTE[n-1])×256^2/G17},即上一字节CRC校验码Y[n]的高8位(YH8[n])与本字节BYTE[n-1]异或,该结果单独计算CRC校验码(即单字节的16位CRC校验码,对单字节可建立表格,预先生成对应的16位CRC校验码),所得的CRC校验码与上一字节CRC校验码Y[n]的低8位(YL8[n])乘以256(即左移8位)异或。

然后依次逐个字节求出CRC,直到BYTE[0]。

字节型算法的一般描述为:本字节的CRC码,等于上一字节CRC码的低8位左移8位,与上一字节CRC右移8位同本字节异或后所得的CRC码异或。

字节型算法如下:1)CRC寄存器组初始化为全"0"(0x0000)。

(注意:CRC寄存器组初始化全为1时,最后CRC应取反。

)2)CRC寄存器组向左移8位,并保存到CRC寄存器组。

3)原CRC寄存器组高8位(右移8位)与数据字节进行异或运算,得出一个指向值表的索引。

4)索引所指的表值与CRC寄存器组做异或运算。

5)数据指针加1,如果数据没有全部处理完,则重复步骤2)。

6)得出CRC。

unsigned short GetCrc_16(unsigned char * pData, int nLength)//函数功能:计算数据流* pData的16位CRC校验码,数据流长度为nLength{unsigned short cRc_16 = 0x0000; // 初始化while(nLength>0){cRc_16 = (cRc_16 << 8) ^ cRctable_16[((cRc_16>>8) ^ *pData) & 0xff]; //cRctable_16表由函数mK_cRctable生成nLength--;pData++;}return cRc_16;}void mK_cRctable(unsigned short gEnpoly)//函数功能:生成0-255对应的16CRC校验码,其实就是计算机算法1(比特型算法)//gEnpoly为生成多项式//注意,低位先传送时,生成多项式应反转(低位与高位互换)。

如CRC16-CCITT为0x1021,反转后为0x8408{unsigned short cRc_16=0;unsigned short i,j,k;for(i=0,k=0;i<256;i++,k++){cRc_16 = i<<8;for(j=8;j>0;j--){if(cRc_16&0x8000) //反转时cRc_16&0x0001cRc_16=(cRc_16<<=1)^gEnpoly; //反转时cRc_16=(cRc_16>>=1)^gEnpolyelsecRc_16<<=1; //反转时cRc_16>>=1}cRctable_16[k] = cRc_16;}}这几天研究了一下CRC算法,碰到了一些问题,研究了一下,小有心得。

CRC算法是在通讯领域广泛采用的校验算法。

原理我就不说了,这里说一下简单的程序实现。

以下均采用CRC多项式为0x1021即:g(x) = x16+x12+x5+x0;CRC的基本原理就不说了,那个搜一下就有了。

最基本的算法应该是按位计算了,这个方法可以适用于所有长度的数据校验,最为灵活,但由于是按位计算,其效率并不是最优,只适用于对速度不敏感的场合。

基本的算法如下:unsigned short do_crc_16(unsigned char *message, unsigned int len) {int i, j;unsigned short crc_reg = 0;unsigned short current;for (i = 0; i < len; i++){current = message[i] << 8;for (j = 0; j < 8; j++){if ((short)(crc_reg ^ current) < 0)crc_reg = (crc_reg << 1) ^ 0x1021;elsecrc_reg <<= 1;current <<= 1;}}return crc_reg;}以是方法可以计算出任意长度数据的校验。

但速度慢。

下面介绍一种按字节计算的方法:按字节校验是每次计算8位数据,多是基于查表的算法,首先要准备一个表,一共256项。

unsigned int crc_ta[256]={ /* CRC余式表 */0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0};unsigned short do_crc_table(unsigned char *ptr,int len){unsigned short int crc;unsigned char da;crc=0;while(len--!=0){da=(unsigned short)crc>>8; /* 以8位二进制数的形式暂存CRC的高8位 */crc<<=8; /* 左移8位,相当于CRC的低8位乘以 */ crc^=crc_ta[da^*ptr]; /* 高8位和当前字节相加后再查表求CRC ,再加上以前的CRC */ptr++;}return(crc);}以上算法实现了按字节进行计算校验值。

相关文档
最新文档