crc算法
- 格式:doc
- 大小:146.00 KB
- 文档页数:21
crc3算法原理CRC(Cyclic Redundancy Check)是一种广泛用于数据传输中的差错校验算法,其中CRC3算法是CRC算法中的一种,用于检测数据传输中的错误。
在计算机通信中,数据传输过程中往往会出现数据传输错误,而CRC3算法可以通过对数据进行校验,快速且准确地检测出这些错误。
CRC3算法的原理主要是通过对数据进行一系列的计算和逻辑运算来生成CRC校验码,然后将这个校验码附加在数据包的末尾一起传输,在接收端再次通过CRC3算法对接收到的数据进行校验,判断数据是否在传输过程中发生了错误。
如果接收端计算的CRC校验码与接收到的校验码不一致,则说明数据传输过程中发生了错误。
CRC3算法的计算过程涉及到多项式除法,其中生成的CRC校验码的长度取决于所选的CRC算法,例如CRC3算法生成的校验码长度为3位。
在计算机通信中,常用的CRC算法还包括CRC8、CRC16、CRC32等,不同的CRC算法在生成校验码的过程中使用的生成多项式也不同。
CRC3算法的优点在于其简单、高效和可靠性,能够快速检测出数据传输中的错误,并且对于单比特差错和多比特差错都有较好的检测能力。
此外,CRC3算法还具有较高的抗干扰性,能够有效应对传输过程中的噪声干扰和数据篡改。
在实际应用中,CRC3算法广泛应用于网络通信、存储系统、文件传输等领域,保障了数据传输的可靠性和完整性。
通过使用CRC3算法,可以有效避免数据传输过程中的错误引发的问题,提高数据传输的准确性和稳定性。
总的来说,CRC3算法作为一种差错校验算法,在数据传输中起着至关重要的作用。
通过对数据进行CRC校验,可以确保数据传输的准确性和完整性,保障了数据通信的可靠性。
CRC3算法的原理简单、高效且可靠,是一种被广泛应用于计算机通信领域的校验算法,对于提高数据传输的质量和可靠性具有重要意义。
crc校验算法crc校验的描述:1.CRC校验原理CRC校验的原理的难易暂不评价,毕竟会者不难,难者不会么。
CRC校验的根本思想是在要发送的帧之后附加⼀个数(CRC校验值),⽣成⼀个新帧,然后发送给接收端。
当然,这个附加的数并不是随意的,他要使新⽣成的帧能在发送端和接收端选定的某个特定的数整除。
当然,这个特定的数和整除的⽅法也不是随意的,特定的数是经过多次论证选定的⼀些列数,这在之后会述说,整除的⽅法是模2除法。
模2除法(crc原理最核⼼的思想)模2除法与算术除法类似,都是除法,不同的是,除的时候既不向上借位,也不⽐较除数和被除数的⼤⼩,只要以相同的位数进⾏相除即可。
模2加法:1+1=0,0+1=1, 0+0=0,⽆进位也⽆借位;模2减法:1-1=0, 0-1=1,0-0=0,也⽆进位,⽆借位,相当于⼆进制中的异或运算。
即⽐较后,相同为0,相异为1。
如100101除以1110,结果的商为11,余数为1.关于模2除法中除数的选择,这个你可以⾃⼰随意选择,开玩笑的,随意选择的除数,会导致帧校验的正确率下降,这是不确定的,要看你选择的除数。
⽽我们⼀般的除数的选择是直接去参照⼀些专家讲过多次试验下来的⼀些除数,这些除法能极⼤的保证帧校验的正确率。
⼀般⽽⾔crc8校验的错误率为1/256,crc16校验的错误率为1/65536,crc32校验的错误率为1/(65536*65536).那这⾥就有⼀个问题,我们传送的是⼀串字节数据,⽽不是⼀个数据,怎么将⼀串数字变成⼀个数据呢?这也很简单,⽐如说2个字节B1,B2,那么对应的数就是(B1<<8)+B2;如果是3个字节B1,B2,B3,那么对应的数就是((B1<<16)+(B2<<8)+B3),⽐如数字是0x01,0x02,0x03,那么对应的数字就是0x10203;依次类推。
如果字节数很多,那么对应的数就⾮常⾮常⼤,不过幸好CRC只需要得到余数,⽽不需要得到商。
CRC算法原理及其Verilog实现⼀.CRC简介CRC校验是⼀种在数据通信系统和其它串⾏传输系统中⼴泛使⽤的错误检测⼿段。
通⽤的CRC标准有CRC-8、CRC-16、CRC-32、CRC-CCIT,其中在⽹络通信系统中应⽤最⼴泛的是CRC-32标准。
本⽂将以CRC-32为例,说明CRC编码的实现⽅式以及如何⽤verilog语⾔对CRC编码进⾏描述。
⼆.模2运算在说明CRC编码⽅式之前,⾸先介绍⼀下模2运算法则,在CRC运算过程中会使⽤到模2除法运算。
模2运算是⼀种⼆进制运算法则,与四则运算相同,模2运算也包括模2加、模2减、模2乘、模2除四种运算。
模2运算⽤“+”表⽰加法运算,⽤“-”、“×”或“.”、“/”分别表⽰减法、乘法和除法运算。
与普通四则运算法则不同的是,模2加法是不带进位的⼆进制加法运算,模2减法是不带借位的⼆进制减法运算。
同时,模2乘法在累加中间结果时采⽤的是模2加法运算;模2除法求商过程中余数减除数采⽤的是模2减法运算。
因此,两个⼆进制数进⾏模2加减法运算时,相当于两个⼆进制数进⾏按位异或运算,每⼀位的结果只与两个数的当前位有关。
模2除法在确定商时,与普通⼆进制除法也略有区别。
普通⼆进制除法中,当余数⼩于除数时,当前位的商为0,当余数⼤于等于除数时,当前位的商为1。
模2除法在确定当前位的商时,只关⼼余数的⾸位,⾸位为1则商为1,⾸位为0则商为0。
1.模2加法的定义:0+0=0,0+1=1,1+0=1,1+1=0。
举例如下:1010+0110=1100。
2.模2减法的定义:0-0=0,0-1=1,1-0=1,1-1=0。
举例如下:1010-0110=1100。
3.模2乘法的定义:0×0=0,0×1=0,1×0=0,1×1=1。
举例如下:1011×101=100111列竖式计算:1011× 101——————101100001011——————100111其中横线之间的累加过程,采⽤的是2进制加法,不进位。
CRC算法及工作原理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的速度较慢。
通过对CRC算法的讨论,我们发觉:一个8位数据加到16位累加器中去,惟独累加器的高8位或低8位与数据相作用,其结果仅有256种可能的组合值。
因而,我们可以用查表法来代替反复的运算,这也同样适用于CRC32的计算。
本文所提供的程序库中,函数crchware是普通的16位 CRC的算法;mk-crctbl用以在内存中建立一个CRC数值表;crcupdate用以查表并更新CRC累加器的值;crcrevhware和 crcrevupdate是反序算法的两个函数;BuildCRCTable、CalculateBlockCRC32和UpdateCharacterCRC32用于CRC32的计算。
引言CRC 的全称为Cyclic Redundancy Check ,中文名称为循环冗余校验。
它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差错控制。
实际上,除数据通信外,CRC 在其它很多领域也是大有用武之地的。
例如我们读软盘上的文件,以及解压一个ZIP 文件时,偶尔会碰到“Bad CRC ”错误,由此它在数据存储方面的应用可略见一斑。
CRC 的算法与实现,对原理只能捎带说明一下。
若需要进一步了解线性码、分组码、循环码、纠错编码等方面的原理,可以阅读有关资料。
利用CRC 进行检错的过程可简单描述为:k 位二进制码序列,以一定的规则产生一个校验用的r 位监督码(CRC 码),附在原始信息后边,构成一个新的二进制码序列数共k+r 位,然后发送出去。
CRC 码之间所遵循的规则进行检验,以确定传送中是否出错。
这个规则,在差错控制理论中称为“生成多项式”。
1 代数学的一般性算法在代数编码理论中,将一个码组表示为一个多项式,码组中各码元当作多项式的系数。
例如 1100101 表示为1·x^6+1·x^5+0·x^4+0·x^3+1·x^2+0·x+1,即 x^6+x^5+x^2+1。
设:编码前的原始信息多项式为P(x),P(x)的最高幂次加1等于k ;生成多项式为G(x),G(x)的最高幂次等于r ;CRC 多项式为R(x);编码后的带CRC 的信息多项式为T(x)。
发送方编码方法:将P(x)乘以x^r(即对应的二进制码序列左移r 位),再除以G(x),所得余式即为R(x)。
用公式表示为()()()r T x x P x R x =+接收方解码方法:将T(x)除以G(x),如果余数为0,则说明传输中无错误发生,否则说明传输有误。
举例来说,设信息码为1100,生成多项式为1011,即P(x)=x3+x2,G(x)=x3+x+1,计算CRC 的过程为()()()()3326532333 111r x x x x P x x x x x x x G x x x x x x x ++==+++++++++= 即R(x)=x 。
CRC校验算法的分析及C语言实现CRC(Cyclic Redundancy Check)是一种简单但有效的校验算法,广泛用于数据通信中的错误检测。
它通过多项式除法实现,可以高效地检测数据传输中的位错误。
以下是对CRC校验算法的分析以及C语言实现。
分析:CRC校验算法基于多项式除法的原理。
它使用一个固定的生成多项式(G),将待校验的数据(信息位)和校验位合并在一起进行除法运算。
在发送端,将生成的余数校验位附加到数据后面一起传输;在接收端,再次进行除法运算,如果整个除法运算的余数为0,则表示数据传输无错误,否则表示数据有错误。
CRC校验算法的核心是生成多项式,它决定了校验能够检测的错误类型和错误个数。
常用的生成多项式有CRC-8、CRC-16和CRC-32、生成多项式的选择需要根据具体的应用场景和需求进行权衡,不同的生成多项式对应不同的CRC校验算法。
C语言实现:以下是一个简单实现CRC-16校验算法的示例代码:```c#include <stdio.h>#define CRC_POLYNOMIAL 0x8005unsigned int crc16(unsigned char* data, int length)unsigned int crc = 0;int i, j;for (i = 0; i < length; i++)crc ^= (unsigned int)data[i] << 8;for (j = 0; j < 8; j++)if (crc & 0x8000)crc = (crc << 1) ^ CRC_POLYNOMIAL;} elsecrc <<= 1;}}}return crc;int maiunsigned char data[] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB}; int length = sizeof(data) / sizeof(data[0]);unsigned int checksum = crc16(data, length);printf("Checksum: 0x%04X\n", checksum);return 0;```在该示例代码中,`crc16`函数接受待校验的数据和数据长度作为输入,返回计算得到的CRC校验值。
CRC校验的算法实现一、CRC简介CRC基于多项式的编码技术。
在多项式编码中,将信息位串看成阶次为从X^k-1到X^0的信息多项式M(x)的系数序列,在计算CRC码时,发送方和接收方必须采用同一个生成多项式G(x),G(x)的阶次应该低于M(x),且最高和最低阶的系数为1。
根据发送端要传送的k位二进制码序列,可以以一定的规则产生一个r位检验码(就是CRC码),附在信息后面,构成一个新的二进制码序列数共(k+r)位,为传送多项式T(x),最后将其发送出去。
产生CRC码的方法是:以16位CRC码产生规则为例:先将要发送的二进制序列数左移16位(即乘以2的16 次方后)后,再除以生成多项式(这里采用的是模2运算法则,即多项式除法中采用不带借位的减法运算,运算等同于异或运算。
),最后所得到的余数就是CRC码。
任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。
例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。
二、检验原理因为接收端接收到的传送多项式T(x)一定能被生成多项式G(x)模2整除,所以可用来判断传输过程是否出现错码。
接收端有两种处理方式:1、计算k位序列的CRC码,与接收到的CRC比较,一致则接收正确。
2、计算整个k+r 位的CRC码,若为0,则接收正确。
三、算法实现这里采用 CRC-CCITT 多项式G(X) = X16 + X12 + X5 + 1,多项式为0x11021,因为第一位固定位1可省略,故C语言编程时,参与计算的为0x1021。
当按位计算CRC时,例如计算二进制序列为1001 1010 1010 1111时,将二进制序列数左移16位,即为1001 1010 1010 1111 (0000 0000 0000 0000),实际上该二进制序列可拆分为1000 0000 0000 0000 (0000 0000 0000 0000) + 000 0000 0000 0000 (0000 0000 0000 0000) + 00 0000 0000 0000 (0000 0000 0000 0000) + 1 0000 0000 0000 (0000 0000 0000 0000) + ……共16个二进制分序列。
CRC校验算法分析及C语言实现CRC(Cyclic Redundancy Check)校验是一种常用的错误检测算法,可以用于网络通信、存储设备等各种领域。
CRC校验使用除法运算来计算一个校验码,用于检测数据是否在传输或存储过程中发生了变化。
1.初始化一个除数,通常情况下为一个预定义的多项式。
需要注意的是,除数的位数决定了校验码的位数。
常用的CRC校验多项式包括CRC-8、CRC-16和CRC-322.将待校验的数据和除数进行异或操作,计算出一个结果。
3.对上一步得到的结果进行右移一位,然后继续与除数进行异或操作。
4.重复步骤3,直到数据的所有位都被处理完。
5.最后得到的余数就是CRC校验码。
下面是一个用C语言实现CRC校验算法的示例代码:```c#include <stdio.h>//CRC校验多项式unsigned int crc_poly = 0x04C11DB7;//计算CRC校验码unsigned int crc_calculate(unsigned char *data, int length)unsigned int crc = 0xFFFFFFFF; // 初始值for (int i = 0; i < length; i++)crc ^= (data[i] << 24); // 将输入数据的最高位移动到CRC的最高位for (int j = 0; j < 8; j++)crc = (crc << 1) ^ crc_poly; // 左移一位后,如果最高位是1,则与多项式异或} elsecrc <<= 1; // 左移一位}}}return crc;int maiunsigned char data[] = "Hello, world!";int length = sizeof(data) - 1;unsigned int crc = crc_calculate(data, length);printf("CRC: %08X\n", crc);return 0;```需要注意的是,CRC校验算法的实现可以根据具体需求进行调整。
CRC校验算法的分析及C语言实现CRC(循环冗余校验)是一种常见的校验算法,用于检测和纠正数据传输中的错误。
CRC校验算法通过生成多项式对发送的数据进行计算,并将校验结果附加到数据中进行传输。
接收方可以使用相同的多项式进行计算,并将结果与接收到的数据进行比较,以检查是否存在传输错误。
1.选择一个生成多项式,通常用一个16位或32位的二进制数表示。
2.将原始数据与补充的0进行异或操作,并左移一个单位。
3.重复上述步骤,直到向左移位的次数等于生成多项式的位数。
4.将得到的余数作为校验位,将其附加到原始数据后面。
5.接收方使用相同的生成多项式进行计算,并将计算得到的余数与接收到的数据进行比较。
如果两者不相等,则说明数据存在错误。
接下来,我们将使用C语言实现一个简单的CRC校验算法。
```c#include <stdio.h>#include <stdbool.h>unsigned long crc_table[256];//初始化CRC表void init_crc_tablunsigned long crc;int i, j;for (i = 0; i < 256; i++)crc = i;for (j = 8; j > 0; j--)if (crc & 1)crc = (crc >> 1) ^ POLYNOMIAL;elsecrc >>= 1;}crc_table[i] = crc;}//计算CRC值unsigned long crc32(unsigned char *message, int length) unsigned long crc = 0xfffffffful;int i;for (i = 0; i < length; i++)crc = (crc >> 8) ^ crc_table[(crc & 0xff) ^ message[i]]; return crc ^ 0xfffffffful;int maiint length = sizeof(message) - 1;init_crc_table(;unsigned long crc = crc32(message, length);printf("CRC32: %lx\n", crc);return 0;```上述代码中,我们首先定义了一个生成多项式POLYNOMIAL,并定义了一个包含256个元素的CRC表crc_table。
校验原理1、循环校验码(CRC码):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。
2、生成CRC码的基本原理:任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。
例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。
3、CRC码集选择的原则:若设码字长度为N,信息字段为K位,校验字段为R位(N=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得V(x)=A(x)g(x)=x R m(x)+r(x);其中: m(x)为K次信息多项式, r(x)为R-1次校验多项式,g(x)称为生成多项式:g(x)=g0+g1x+g2x2+...+g(R-1)x(R-1)+gRx R发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC 码字。
4、CRC校验码软件生成方法:借助于多项式除法,其余数为校验字段。
例如:信息字段代码为: 1011001;对应m(x)=x6+x4+x3+1假设生成多项式为:g(x)=x4+x3+1;则对应g(x)的代码为: 11001x4m(x)=x10+x8+x7+x4对应的代码记为:10110010000;采用多项式除法: 得余数为: 1010 (即校验字段为:1010)发送方:发出的传输字段为: 1 0 1 1 0 0 1 1 0 10信息字段校验字段接收方:使用相同的生成码进行校验:接收到的字段/生成码(二进制除法)如果能够除尽,则正确,CRC校验源码分析这两天做项目,需要用到CRC 校验。
以前没搞过这东东,以为挺简单的。
结果看看别人提供的汇编源程序,居然看不懂。
花了两天时间研究了一下CRC 校验,希望我写的这点东西能够帮助和我有同样困惑的朋友节省点时间。
先是在网上下了一堆乱七八遭的资料下来,感觉都是一个模样,全都是从CRC 的数学原理开始,一长串的表达式看的我头晕。
第一次接触还真难以理解。
这些东西不想在这里讲,随便找一下都是一大把。
我想根据源代码来分析会比较好懂一些。
费了老大功夫,才搞清楚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以下的源程序全部以CCITT 为例。
其实本质都是一样,搞明白一种,其他的都是小菜。
图1,图 2 说明了CRC 校验中CRC 值是如何计算出来的,体现的多项式正是X16+X12+X5+1。
Serial Data 即是需要校验的数据。
从把数据移位开始计算,将数据位(从最低的数据位开始)逐位移入反向耦合移位寄存器(这个名词我也不懂,觉得蛮酷的,就这样写了,嘿)。
当所有数据位都这样操作后,计算结束。
此时,16 位移位寄存器中的内容就是CRC 码。
图中进行XOR 运算的位与多项式的表达相对应。
X5 代表Bit5,X12 代表Bit12,1 自然是代表Bit0,X16 比较特别,是指移位寄存器移出的数据,即图中的DATA OUT。
可以这样理解,与数据位做XOR 运算的是上次CRC值的Bit15。
根据以上说明,可以依葫芦画瓢的写出以下程序。
(程序都是在keil C 7.10 下调试的)typedef unsigned char uchar;typedef unsigned int uint;code uchar crcbuff [] = { 0x00,0x00,0x00,0x00,0x06,0x0d,0xd2,0xe3};uint crc; // CRC 码void main(void){uchar *ptr;crc = 0; // CRC 初值ptr = crcbuff; // 指向第一个Byte 数据crc = crc16l(ptr,8);while(1);}uint crc16l(uchar *ptr,uchar len) // ptr 为数据指针,len 为数据长度{uchar i;while(len--){for(i=0x80; i!=0; i>>=1){if((crc&0x8000)!=0) {crc<<=1; crc^=0x1021;} 1-1else crc<<=1; 1-2if((*ptr&i)!=0) crc^=0x1021; 1-3}ptr++;}return(crc);}执行结果crc = 0xdbc0;程序1-1,1-2,1-3 可以理解成移位前crc 的Bit15 与数据对应的Bit(*ptr&i)做XOR运算,根据此结果来决定是否执行crc^=0x1021。
只要明白两次异或运算与原值相同,就不难理解这个程序。
很多资料上都写了查表法来计算,当时是怎么也没想通。
其实蛮简单的。
假设通过移位处理了8 个bit 的数据,相当于把之前的CRC 码的高字节(8bit)全部移出,与一个byte 的数据做XOR 运算,根据运算结果来选择一个值(称为余式),与原来的CRC 码再做一次XOR 运算,就可以得到新的CRC 码。
不难看出,余式有256 种可能的值,实际上就是0~255 以X16+X12+X5+1 为权得到的CRC码,可以通过函数crc16l来计算。
以1 为例。
code test[]={0x01};crc = 0;ptr = test;crc = crc16l(ptr,1);执行结果crc = 1021,这就是1 对应的余式。
进一步修改函数,我这里就懒得写了,可得到X16+X12+X5+1 的余式表。
code uint crc_ta[256]={ // X16+X12+X5+1 余式表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 };根据这个思路,可以写出以下程序:uint table_crc(uchar *ptr,uchar len) // 字节查表法求CRC{uchar da;while(len--!=0){da=(uchar) (crc/256); // 以8 位二进制数暂存CRC 的高8 位crc<<=8; // 左移8 位crc^=crc_ta[da^*ptr]; // 高字节和当前数据XOR 再查表ptr++;}return(crc);}本质上CRC 计算的就是移位和异或。