CRC终于搞成了

合集下载

CRC校验原理及推导过程

CRC校验原理及推导过程

1.1 伽罗华域 (2 )在伽罗华域 (2 )中的元素由 (2)上的本原多项式构造,域中的元素两两运算之后 例如当 = 4,本原多项式为: ( ) = + + 1, (2 )中的元素集合CRC 校验原理及推导过程1 代数引论参考文献[1]对伽罗华域、线性码、循环码、缩短循环码进行了很好的论述。

的结果依然是该域中的元素,域中运算是基于模 2 的。

4 4{0,1, , 2, 3,⋯, 14},转换为十六进制数依次对应为{0,1,2,4,8,3,6, , ,5, ,7, , , ,9},转换为 多项式依次对应为 {0,1, , 2, 3, + 1, 2 + , 3 + 2, 3 + + 1, 2 + 1, 3 + , 2 + + 1, 3 + 2 + , 3 +。

于是: 15= ∙ 14 = ∙ (1 + 3) = + 4 = + 1 + = 17 + 5 = ( 2 + ) + ( 3 + + 1) = 3 + 2 + 1 = 131.2 模运算法则模运算与基本四则运算有些相似,但是除法例外。

其规则如下(a+b) % p = (a % p + b % p) % p (1-1) (a-b) % p = (a % p - b % p) % p(1-2) (a × b) % p = ((a % p ) × (b % p ))% p (1-3) a b % p = ((a % p)b ) %p(1-4)结合率:((a+b) % p+c) % p = (a+(b+c) % p) % p (1-5)((a × b) % p × c)% p = (a × (b × c) % p) % p(1-6)交换率:(a+b) % p = (b+a) % p (1-7) (a × b) % p = (b × a) % p(1-8)分配率:((a +b)% p × c) % p = ((a × c) % p + (b × c) % p) % p (1-9)一个长度为 ,有2 个码字的分组码,当且仅当其2 个码字构成 (2)域上1.3 线性分组码和循环码所有 维向量组成的向量空间的一个 维子空间是被称为( , )线性码。

crc知识点总结

crc知识点总结

crc知识点总结概述循环冗余校验(CRC, Cyclic Redundancy Check)是一种错误检测技术,常用于网络通信、存储系统、通信协议等领域。

它利用除法运算和多项式运算,通过对数据进行计算生成校验码,用于检测数据传输过程中的错误。

CRC的应用范围非常广泛,其简单、高效的特性使得它成为了数据通信中重要的一环。

在现代通信系统中,CRC已经成为了各种通信协议的标准之一,如以太网、WiFi、蓝牙等都应用了CRC进行数据的校验。

本文将对CRC的原理、计算方法、性能评估等知识点进行总结和讨论。

CRC原理CRC的基本原理是通过对数据进行除法运算,利用多项式来生成校验码。

通常情况下,发送方将数据和计算得到的校验码一起发送给接收方,接收方通过对接收的数据和计算校验码进行同样的计算,如果计算得到的校验码与接收到的校验码一致,说明数据传输正确。

CRC可以看作是对多项式的模运算。

对于给定的生成多项式G(x),发送方对数据D(x)进行计算,生成校验码R(x),使得数据发送为D(x) * 2^k + R(x),接收方再对接收到的数据进行同样的计算,得到的余数如果为0则说明数据传输正确。

CRC计算方法CRC的计算方法主要包括两种:硬件实现和软件实现。

硬件实现是指将CRC算法实现为硬件电路的形式,它具有计算速度快、稳定可靠等优点。

通常情况下,硬件实现可以集成到通信芯片、存储芯片等设备中,实现对数据的快速校验。

软件实现是指利用软件程序来实现CRC算法,其优点是易于开发和调试。

通常情况下,可以利用现成的CRC算法库来实现CRC校验功能。

CRC的计算方法可以分为两种:直接计算法和表查找法。

直接计算法是最基本的一种计算方法,其思想是模拟除法运算,通过位运算来逐位计算余数。

这种方法的计算速度相对较慢,但实现起来比较简单。

表查找法是一种优化的计算方法,它利用预先计算好的CRC表来实现CRC校验。

通过查表的方式来实现CRC的计算,可以极大地提高计算速度和效率。

介绍两个CRC源码生成工具,可生成Verilog和VHDL

介绍两个CRC源码生成工具,可生成Verilog和VHDL

32
lfsr_q <= {5{1'b1}};
33
end
ቤተ መጻሕፍቲ ባይዱ
34
else begin
35
lfsr_q <= crc_en ? lfsr_c : lfsr_q;
36
end
37
end // always
38 endmodule // crc
39
10
input
clk);
11
12
reg [4:0] lfsr_q,
13
lfsr_c;
14
assign crc_out = lfsr_q;
15
always @(*) begin
16
lfsr_c[0] = lfsr_q[0] ^ lfsr_q[2] ^ lfsr_q[3] ^ data_in[0] ^ dat
三、代码分析比较
1、 网 页 在 线 生 成 代 码
1 module CRC5_D8; 2 3 // polynomial: (0 2 5) 4 // data width: 8 5 // convention: the first serial bit is D[7] 6 function [4:0] nextCRC5_D8; 7 8 input [7:0] Data; 9 input [4:0] crc; 10 reg [7:0] d; 11 reg [4:0] c; 12 reg [4:0] newcrc; 13 begin 14 d = Data; 15 c = crc; 16 17 newcrc[0] = d[6] ^ d[5] ^ d[3] ^ d[0] ^ c[0] ^ c[2] ^ c[3]; 18 newcrc[1] = d[7] ^ d[6] ^ d[4] ^ d[1] ^ c[1] ^ c[3] ^ c[4]; 19 newcrc[2] = d[7] ^ d[6] ^ d[3] ^ d[2] ^ d[0] ^ c[0] ^ c[3] ^ c[4]; 20 newcrc[3] = d[7] ^ d[4] ^ d[3] ^ d[1] ^ c[0] ^ c[1] ^ c[4]; 21 newcrc[4] = d[5] ^ d[4] ^ d[2] ^ c[1] ^ c[2]; 22 nextCRC5_D8 = newcrc; 23 end 24 endfunction 25 endmodule 26

CRC32、CRC16、CRC原理及算法

CRC32、CRC16、CRC原理及算法

我学习CRC32、"CRC16、"CRC原理和算法的总结(与WINRAR结果一致)比较愚钝,学了CRC校验好几天,很痛苦的过程,现终于有眉目了,总结一下。

国外版的“轻松无痛苦学习CRC指南”,在http:31."html(为什么好的资料都是老外写的?)我的英文有限,这种专业性太强的文章,很多都看不太明白,所以没办法翻译,靠参考国内的翻译和自己瞎琢磨的。

国内的翻译比较不全,而且有点误导,能看英文的还是看英文吧,国内版资料比较零散,可参考:http:10190."htmlhttp:."shtmlhttp:1637."htm我结合国内资料和英文原版进行总结,达到和WINRAR一样的CRC32计算结果。

一、"CRC原理可参考http:计算CRC的过程,就是用一个特殊的“除法”,来得到余数,这个余数就是CRC。

它不是真正的算术上的除法!过程和算术除法过程一样,只是加减运算变成了XOR(异或)运算!算术上的除法:120÷9=13余3,120是被除数,9是除数,13是商,3是余数。

念作120除以9,或者9除120,或者9去除120!(除法的过程就不写了)这个除法计算机当然会做,但是做起来很麻烦,因为减法有借位,很耗时间和指令!所以,计算CRC也是除法,但是用XOR来代替减法,这就简单多了!CRC的除法:120÷9=14余6,商、余数和算术除法不一定相同!!因为除法用的是XOR,而不是真正的减法。

以二进制模拟这个计算过程:1110商为1110,即14,商有4位,表示进行了4次XOR____1001/11000被除数120是11000,除数9是10011001 ^----1100第一次XOR后得到011,加入下一位0。

"最高位的0可以消掉了,这样最高位是1,所以下个商是11001 ^----10第二次XOR后得到01,加入下一位0。

crc校验一探究的详细流程和注意事项

crc校验一探究的详细流程和注意事项

crc校验一探究的详细流程和注意事项嘿呀!今天咱们来好好聊聊“CRC 校验一探究的详细流程和注意事项”。

首先呢,咱们得搞清楚啥是CRC 校验。

哎呀呀,简单来说,CRC 校验就是一种用于检测数据传输或存储过程中是否出现错误的方法。

哇,它可重要了呢!那CRC 校验的详细流程到底是咋样的呢?第一步呀,要选择合适的生成多项式。

这可不能随便选,得根据具体的应用场景和需求来。

比如说,如果对数据准确性要求特别高,那就得选一个更复杂、更能检测出错误的生成多项式。

接下来,就是计算CRC 值啦。

这一步可得仔细,不能出一点差错。

要把要校验的数据按照一定的规则进行处理,然后通过一系列复杂的运算得出CRC 值。

然后呢,在数据传输或者存储的时候,要把这个计算出来的CRC 值一起带上。

等到接收方或者读取数据的时候,再按照同样的规则重新计算CRC 值。

如果计算出来的CRC 值和发送或者存储时带上的CRC 值一样,那就说明数据没有出错,哎呀呀,太棒啦!要是不一样,那就说明数据在传输或者存储过程中出问题啦,得赶紧采取措施。

在进行CRC 校验的过程中,有好些注意事项呢!比如说,生成多项式的选择就特别关键。

要是选得不好,可能会漏掉一些错误,那就麻烦大啦!还有呀,计算CRC 值的过程中,任何一个小的错误都会导致结果不准确。

所以呢,计算的时候一定要认真仔细,反复核对。

另外,不同的系统和设备对CRC 校验的实现方式可能会有一些差异。

这时候就得注意兼容性的问题啦,不然可能会出现意想不到的错误哟!而且,在处理大数据量的时候,计算CRC 值的效率也很重要。

如果算法太复杂,速度太慢,可能会影响整个系统的性能呢。

总之,CRC 校验虽然看起来有点复杂,但是只要我们搞清楚详细流程,注意那些关键的事项,就能很好地保证数据的准确性和完整性。

哇,是不是觉得很有收获呀?。

CRC算法原理

CRC算法原理

CRC校验算法CRC(Cyclic Redundancy Check)循环冗余校验是常用的数据校验方法,讲CRC算法的文章很多,之所以还要写这篇,是想换一个方法介绍CRC算法,希望能让大家更容易理解CRC 算法。

先说说什么是数据校验。

数据在传输过程(比如通过网线在两台计算机间传文件)中,由于传输信道的原因,可能会有误码现象(比如说发送数字5但接收方收到的却是6),如何发现误码呢?方法是发送额外的数据让接收方校验是否正确,这就是数据校验。

最容易想到的校验方法是和校验,就是将传送的数据(按字节方式)加起来计算出数据的总和,并将总和传给接收方,接收方收到数据后也计算总和,并与收到的总和比较看是否相同。

如果传输中出现误码,那么总和一般不会相同,从而知道有误码产生,可以让发送方再发送一遍数据。

CRC校验也是添加额外数据做为校验码,这就是CRC校验码,那么CRC校验码是如何得到的呢?非常简单,CRC校验码就是将数据除以某个固定的数(比如ANSI-CRC16中,这个数是0x18005),所得到的余数就是CRC校验码。

那这里就有一个问题,我们传送的是一串字节数据,而不是一个数据,怎么将一串数字变成一个数据呢?这也很简单,比如说2个字节B1,B2,那么对应的数就是(B1<<8)+B2;如果是3个字节B1,B2,B3,那么对应的数就是((B1<<16)+(B2<<8)+B3),比如数字是0x01,0x02, 0x03,那么对应的数字就是0x10203;依次类推。

如果字节数很多,那么对应的数就非常非常大,不过幸好CRC只需要得到余数,而不需要得到商。

从上面介绍的原理我们可以大致知道CRC校验的准确率,在CRC8中出现了误码但没发现的概率是1/256,CRC16的概率是1/65536,而CRC32的概率则是1/2^32,那已经是非常小了,所以一般在数据不多的情况下用CRC16校验就可以了,而在整个文件的校验中一般用CRC32校验。

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算法原理及其Verilog实现

CRC算法原理及其Verilog实现

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进制加法,不进位。

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

今晚看了好久CRC,最后还有没有很明白。

但是做为一个做工程的,有结果就好了。

我要用的不是标准的CRC公式,是X8+1这个,呵呵。

下面开始总结。

CRC用到的主要是模2除法,开始看得一头雾水,只有把这个弄清楚了,后来才有了思路。

才知道CRC的计算过程。

(此处是重点,我费了很多劲儿理解,省去若干字。

)不知道计算过程,程序是绝对不能看懂的。

还有这么一句话:多项式的MSB略去不记,因其只对商有影响而不影响余数。

就是说对于CRC-CCITT=X16+X12+X5+1,可以只用0x1021,bit16位的1不要了,只留下bit12、5、0。

(参考一篇modbus的说明)记住这两点,再参考下面一段话:生成CRC-16校验字节的步骤如下:①装如一个16位寄存器,所有数位均为1。

②该16位寄存器的高位字节与开始8位字节进行“异或”运算。

运算结果放入这个16位寄存器。

③把这个16寄存器向右移一位。

④若向右(标记位)移出的数位是1,则生成多项式1010000000000001和这个寄存器进行“异或”运算;若向右移出的数位是0,则返回③。

⑤重复③和④,直至移出8位。

⑥另外8位与该十六位寄存器进行“异或”运算。

⑦重复③~⑥,直至该报文所有字节均与16位寄存器进行“异或”运算,并移位8次。

⑧这个16位寄存器的内容即2字节CRC错误校验,被加到报文的最高有效位。

别的都是弯路,以上是最清楚的、实惠的解释了。

本文最后,附上另一位网游的文章,也给我很大启发。

下面是成功的程序:unsigned short crc(unsigned char *addr, int num){int i;while (num--){crc8 ^= *addr++;for (i = 0; i < 8; i++){if (crc8 & 128){crc8 <<= 1;crc8 ^= 0x01; //1010 0000 0000 0001b}else{crc8 <<= 1;}}}return crc8;}另外这样也行:unsigned short crc(unsigned char *addr, int num) {//unsigned short crc8 = 0xFF;int i;while (num--){crc8 ^= *addr++;for (i = 0; i < 8; i++){if (crc8 & 1){crc8 >>= 1;crc8 ^= 0x80; //1010 0000 0000 0001b}else{crc8 >>= 1;}}}return crc8;}可能是因为我的x8+1只有一位的原因吧,或者什么其他的原因,我已经不愿意思考下去了。

好累。

注意:其中两个关键的地方就是移位1.操作不同;2.生成多项式对应的字节值不同。

调整这两个变量,我想,能实现不同生成多项式的CRC算法。

另外还有查表的方式,希望以后再用到,我可以很快的搞懂。

转: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 码。

图1 生成CRC-CCITT 的移位寄存器的作用原理图2 用于计算CRC_CCITT 的移位寄存器的电路配置图中进行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 计算的就是移位和异或。

相关文档
最新文档