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, 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
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原理和算法的总结(与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(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(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简介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进制加法,不进位。
CRC16的生成及校验原理
CRC16的⽣成及校验原理计算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,⽽不是真正的减法。
以⼆进制这个计算过程:120 ⼆进制:1111000 、除数9 ⼆进制:1001 、商 14 ⼆进制:1110 余数6 ⼆进制:110从⾼位1111开始,每次进⾏⼀次XOR 的到的值后,去掉最⾼位加⼊下⼀位,每加⼀次进⾏⼀次XOR运算。
1111^1001--------------0110第⼀次XOR后得到0110,去掉最⾼位0,加⼊下⼀位0, 得1100 ,这样最⾼位是1,所以下个商是1 ,⽤^1001【很明显保留的位数与1001 保持⼀致】1100^1001--------------0101第⼆次XOR ,去掉最⾼位,加⼊下⼀位0,得1010 ,这样最⾼位是1,所以下个商是1 ,⽤^10011010^ 1001---------------0011第三次XOR,去掉最⾼位,加⼊下⼀位0,得0110 ,这样最⾼位是1,所以下个商是0 ,⽤^00000110^ 0000-------------0110最后⼀次XOR后得到0110,最⾼位的0可以消掉了,得到余数为110,即6注意,余数不是0110,⽽是110,因为最前⾯那个0已经被XOR后消掉了!可见,除法(XOR)的⽬的是逐步消掉最⾼位的1或0!由于过程是XOR的,所以商是没有意义的,我们不要。
5g通信所用到的crc码及其生成矩阵
5g通信中的CRC码是一种循环冗余校验码,用于对发送的数据进行错误检测和纠正。
CRC码是通过一系列的数学运算来生成的,其生成矩阵是CRC码生成的关键环节。
1. CRC码的概念CRC码是Cyclic Redundancy Check的缩写,用于对数据进行检验,通常用来验证数据传输的完整性。
在5g通信中,CRC码被广泛应用于数据传输的可靠性保障,确保数据在传输过程中不会因为出现错误而导致丢失或损坏。
2. CRC码的生成原理CRC码的生成原理是通过一个特定的生成多项式和一系列的位操作来实现的。
在5g通信中,CRC码通常采用的是多项式的形式来生成,具体生成的步骤是将数据按照特定的多项式进行计算,并将计算结果作为校验码附加在数据传输的末尾。
3. CRC码的生成矩阵CRC码的生成矩阵是一种数学表达方式,用于描述生成多项式的系数和操作规则。
在5g通信中,CRC码的生成矩阵通常采用的是一个固定长度的二进制数,用来表示生成多项式的系数和幂次。
这个生成矩阵是CRC码生成的关键环节,决定了CRC码的生成规则和校验方法。
4. 5g通信中常用的CRC码在5g通信中,常用的CRC码包括CRC-8、CRC-16、CRC-32等不同长度的CRC码。
这些CRC码通常具有不同的生成多项式和生成矩阵,用来适应不同长度的数据传输和不同的纠错需求。
5. CRC码的应用场景在5g通信中,CRC码通常应用于物理层和数据链路层的数据传输过程中,用来对数据进行校验和纠错。
通过CRC码的附加和校验,可以有效地提高数据传输的可靠性和稳定性,避免出现数据传输错误导致通信质量下降的情况。
总结:CRC码作为5g通信中数据传输的重要保障手段,其生成矩阵是CRC码生成的关键环节。
通过对CRC码的生成矩阵进行深入研究和分析,可以更好地理解CRC码的生成原理和应用规则,为5g通信的数据传输提供更加可靠和稳定的保障。
6. CRC码生成矩阵的设计与优化在5G通信中,CRC码的生成矩阵的设计和优化对系统性能和可靠性有着重要的影响。
简单有效的单片机CRC快速算法
简单实用的单片机CRC快速算法1 引言CRC(循环冗余码)检验技术广泛应用于测控及通信领域。
在很多情况下,CRC计算是靠专用的硬件来实现的,但是对于小型低成本的单片机系统来说,若要在没有这些硬件的支持下实现CRC检验,首先要解决的就是如何通过软件高效快速地完成CRC计算的问题,也就是CRC算法的问题。
这里将提供两种算法,它们稍有不同,一种适用于程序空间大一些的51系列等单片机,另一种适用于程序空间的使用条件十分苛刻的PIC单片机。
这些算法按字节进行计算,仅使用查表和简单的异或运算等操作,所以,计算过程相当简捷,而计算速度却很快。
下面先简述一下CRC原理,然后再以CRC-CCITT标准生成多项式为例对算法进行说明,并给出一个51系列单片机子程序和一个PIC单片机子程序。
2 CRC原理CRC检验原理实际上就是在一个p位二进制数据序列之后附加一个r位二进制检验码(序列),从而构成一个总长为n=p +r位的二进制序列,例如,p位二进制数据序列D=[dp-1dp-2 ......d1d0],r位二进制检验码R=[rr-1 rr-2....r1 r0],所得到的这个n位二进制序列就是M=[dp-1dp-2 ......d1d0 rr-1 rr-2....r1 r0];附加在数据序列之后的这个检验码与数据序列的内容之间存在着某种特定的关系。
如果因干扰等原因使数据序列中的某一位或某些位发生错误,这种特定关系就会被破坏,因此,通过检查这一关系, 就可以实现对数据正确性的检验。
校验码R是通过对数据序列D进行二进制除法取余式运算得到的,它被一个称为生成多项式的(r+1)位二进制序列G =[gr gr-1 .... g1 g0]来除,用多项式形式表示为其中,xrD(x)表示将数据序列D左移r位(即在D的末尾再增加r个0位),Q(x)代表这一除法所得的商,R(x)就是所需的余式。
这一运算关系还可以用式(2)来表达其中,Re[ ]表示对括号内的式子进行取余式运算。
crc校验码计算
crc校验码计算
CRC校验码(Cyclic Redundancy Check,即循环冗余校验)是一
种数据传输中用来检查错误的技术,可以把多余的数据发送到接收到
的机器,并将期望的结果通过校验码进行比较,以检查在传输过程中
是否出现错误。
要计算CRC,首先需要将数据分割成一系列字节,然后用这些字节填充一个n位的CRC字段,n的大小取决于想要获取的校验码的精确度。
接下来,需要使用一些特定的位并将每个字节与位进行异或操作,以
计算出校验码。
其实,CRC校验码计算过程并不复杂,基本操作可以分成三步:
(1)将一个信息帧中的所有字节按一定的次序排列;
(2)以某一特定的模数,将这些字节与一个特定的多项式进行运算;
(3)把结果值放入CRC校验码字段,该值用于表示这一帧中任何
字节出现错误的几率是多少。
有了这样的计算表达式,对于一个给定的数据流,按上面的步骤,经过一些固定的运算,就能计算出一个CRC校验码。
而当接收方收到
数据后,也可以按同样的计算过程,计算出一个收到的CRC校验码。
接收方只需比较接收到的CRC校验码与计算出来的CRC校验码是否一致,就能判断数据是否发送过程中出现错误。
当然,CRC校验码有其自身的特点,它能够检查给定数据中比原数据本身更多的数据,可以检测比1位误码更多的多位误码,具有比校
验和的可靠性更高的优点。
CRC汇总介绍
CRC介绍CRC 检验的基本思想是利用线性编码理论,在发送端根据要传送的k 位二进制码序列,以一定的规则产生一个检验码r位(就是CRC码),附在信息后面,构成一个新的二进制码序列数共(k+r)位,最后发送出去。
接收端根据同样的规则校验,以确定传送中是否出错。
接收端有两种处理方式:1、计算k位序列的CRC码,与接收到的CRC比较,一致则接收正确。
2、计算整个k+r 位的CRC码,若为0,则接收正确。
一般数据量不大时,使用Checksume验错方式就行了;数据量大时,就用CRC了;据理论统计,用CRC16时,超过17个连续位的错误侦测率为99。
9969%,小于此的为100%。
CRC算法一般作为冗余校验之用,由于它的可逆性的不完整,导致了正规的CRC 算法不能称之为CRC密码。
CRC之精华由初值、权、方向及位数组成,对其输入(明文)做CRC正运算得到输出的结果(密文)。
即:密文=CRC正运算(初值,权,方向,位数,明文);反之,对其输出(密文)做CRC逆运算得到CRC的结果(明文)。
即:明文=CRC逆运算(初值,权,方向,位数,密文);但要想实现CRC的可逆运算,必须满足:CRC右移时,CRC权的最高位为1. CRC左移时,CRC权的最低位为1。
但是传统的CRC算法是:本次的CRC初值是上次CRC运算的结果即密文。
这是CRC算法不能成为CRC密码的最大败笔所在!!!关于CRC算法,知其然,如果再知其所以然,事情就会清楚了。
CRC算法,最重要的参数当然是生成多项式(CRC Polynomial),但(余数)初值和CRC数据最高位的位置也是很重要的两个参数,而这两个参数需要根据具体情况具体分析的。
初值一般是全0或者全1,CRC数据最高位一般在最低字节的最低位或者最高位。
CRC算法,作为一种检错算法,它的着眼点是出错概率高地方的错误,这在一定程度上决定了后两个参数。
下面举例来说明。
1.串口通信在通信电缆的出错概率高,而串口数据是从LSb先发送,所以比较合理的做法是 CRC数据最高位是第1个被发送字节的最低位。
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)的基本原理
几个基本概念
1、多项式与二进制数码
多项式和二进制数有直接对应关系:x的最高幂次对应二进制数的最高位,以下各位对应多项式的各幂次,有此幂次项对应1,无此幂次项对应0。可以看出:x的最高幂次为R,转换成对应的二进制数有R+1位。
(3)用生成多项式(二进制数)对f(x)*XR做模2除,得到余数(即校验码)。
(4)将余数多项式加到f(x)*XR中,得到完整的CRC码。
【例】假设使用的生成多项式是G(x)=x3+x+1。4位的原始报文为1010,求编码后的报文。
解:
(1)将生成多项式G(x)=x3+x+1转换成对应的二进制除数1011。
31 215 x10+x9+x8+x6+x5+x3+111101101001
63 57 3x6+x+11000011
63 51 5 x12+x10+x5+x4+x2+1 1010000110101
10411024x16+x15+x2+1 11000000000000101
图9常用的生成多项式
3、模2除(按位除)
④可检测所有小于、等于校验位长度的突发错
解:从前面有关CRC的论述中可得出:
A:③循环冗余B:①模2除法
C:G(x)=11011,f(x)=11001010101,F(x)*24÷G(x)=110010101010000÷11011余0011
CRC码生成与校验电路设计
课程设计报告课程设计名称:计算机组成原理课程设计课程设计题目:CRC码生成与校验电路的设计院(系):院(系):业:专业:级:班级:号:学号:名:姓名:指导教师:指导教师:完成日期:完成日期:GxGxQ6 Q5 Q4 Q3 Q2 Q1 Q0 余数余数 出错位 正确正确 1 1 0 0 0 1 0 0 0 0 无 错误错误1 1 0 0 0 1 1 0 0 1 Q0 1 1 0 0 0 0 0 0 1 0 Q1 1 1 0 0 1 1 0 1 0 0 Q2 1 1 0 1 0 1 0 0 1 1 Q3 1 1 1 0 0 1 0 1 1 0 Q4 1 0 0 0 0 1 0 1 1 1 Q5 0 1 0 0 0 1 0 1 0 1 Q6 图1.2 Xilinx foundation f3.1设计平台•COP2000集成调试软件COP2000集成开发环境是为COP2000实验仪与PC机相连进行高层次实验的配套软件,它通过实验仪的串行接口和PC机的串行接口相连,提供汇编、图1.3 COP2000计算机组成原理集成调试软件图2.1 CRC码生成电路图图形文件中的输入/输出信号XCV200芯片引脚D 87 A 73 CLK 213 V CC 47 G3 100 G2 101 G1 102 G0 103 Q6 152 Q5 178 Q4 184 Q3 185 Q2 203 Q1 111 Q0 110 L6 93 L5 99 L4 107 L3 108 L2 109 L1 124 L0 125 信号和芯片引脚对应关系表2.1 信号和芯片引脚对应关系图2.3 模2除法器的原理框图(2)创建元件图形符号图2.6 移位寄存器的原理框图D A CLOCK Q6 Q5 Q4 Q3 Q2 Q1 Q0 L6 L5 L4 L3 L2 L1 L01 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 1 0 1 1 0 0 0 1 0 0 0 1 1 1 1 0 1 0 1 1 0 0 0 0 1 0 0 1 1 1 0 1 1 0 1 1 0 0 0 0 0 1 0 1 1 0 0 0 1 0 1 1 0 0 0 1 0 0 1 1 1 0 0 0 1 0 1 1 0 0 0 1 0XCV200芯片引脚信号XCV200实验板XCV200芯片引脚信号XCV200实验板XCV200芯片引脚信号XCV200实验板D K1:0 Q6 A6 L6 B6 A K2:0 Q5 A5 L5 B5 CLK CLOCK Q4 A4 L4 B4 G3 K0:3 Q3 A3 L3 B3 G2 KO:2 Q2 A2 L2 B2 G1 K0:1 Q1 A1 L1 B1 G0 K0:0 Q0 A0 L0 B0 VCC K3:0输入信号输出信号输出信号K0:5 K0:6 A6 A5 A4 A3 A2 A1 A0 B6 B5 B4 B3 B2 B1 B01 1 0 0 0 0 0 0 1 0 0 0 0 0 0 01 1 0 0 0 0 0 0 1 0 0 0 1 0 1 10 0 0 0 0 0 1 1 0 0 0 1 0 1 1 00 0 0 0 0 1 1 1 1 0 1 0 1 1 0 00 0 0 0 1 1 1 0 1 1 0 1 1 0 0 00 0 0 1 1 0 0 0 1 0 1 1 0 0 0 10 0 1 1 0 0 0 1 0 1 1 0 0 0 1 0图3.1 硬件测试参考文献参考文献[1] 曹昕燕. EDA技术实验与课程设计[M].北京:清华大学出版社,2006 [2] 范延滨.微型计算机系统原理、接口与EDA设计技术[M].北京:北京邮电大学微型计算机系统原理、接口与出版社,2006 [ 3 ]爱英计算机组成与结构(第4版)[M].北京:清华大学出版社,2006 [4]潘松,黄继业.EDA技术使用教程.北京:科学出版社,2002 [5]胡越明.2002.计算机组成与系统结构.北京:电子工业出版社北京:电子工业出版社[6]王炜.2006.计算机组成与设计实验教程.北京:科学出版社北京:科学出版社参考文献-19- 课程设计总结:作为本学期收尾工作,我积极的要把这份工作做好。
【原创】CRC算法及CRC密码之探讨
【原创】CRC算法及CRC密码之探讨CRC算法一般作为冗余校验之用,由于它的可逆性的不完整,导致了正规的CRC算法不能称之为CRC密码。
CRC之精华由初值、权、方向及位数组成,对其输入(明文)做CRC正运算得到输出的结果(密文)。
即:密文=CRC正运算(初值,权,方向,位数,明文);反之,对其输出(密文)做CRC逆运算得到CRC的结果(明文)。
即:明文=CRC逆运算(初值,权,方向,位数,密文);但要想实现CRC的可逆运算,必须满足:CRC右移时,CRC权的最高位为1. CRC左移时,CRC权的最低位为1.CRC种类繁多,经典的CRC皆为一表达式,即可得到一张CRC 表。
例如:CRC8右移=X8+X5+X4+1 即二进制的100110001权正确选择D8~D1 即10011000放弃最低位D0,即0x8cCRC8左移=X8+X2+X+1 即二进制的100000111权正确选择D7~D0 即00000111放弃最高位D8,即0x07这样处理后与标准CRC取权一致而且通俗一些。
这样就可以将CRC算法可逆并升级为CRC密码。
虽然找到了CRC权与CRC算法可逆的关系:CRC右移时,CRC权的最高位为1. CRC左移时,CRC权的最低位为1.但是传统的CRC算法是:本次的CRC初值是上次CRC运算的结果即密文。
这是CRC算法不能成为CRC密码的最大败笔所在因为在CRC运算过程中,权保持不变(查表方便),那么密文串中任意相邻的密文左端即为本次的初值。
那么,根据:明文=CRC逆运算(初值,权,方向,位数,密文),立刻得出对应的明文。
即相邻的2个密文即可攻破1个明文。
只要对CRC初值穷举后即可得到第1个明文。
CRC密码即破解。
所以要实现真正的CRC密码,必须去掉CRC算法中本次初值是上次密文的约束,这样才能实现CRC密码的可靠性。
再次张扬CRC之精华---初值、权、方向及位数.如果在位数(或分组)一定时,若每次CRC运算都能保证初值、权、方向这3个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)得到的余数就是校验码。
对应关系多项式和二进制数有直接对应关系: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除检测和确定错误位置。
应满足以下条件:A、生成多项式的最高位和最低位必须为1。
B、当被传送信息(CRC码)任何一位发生错误时,被生成多项式做除后应该使余数不为0。
C、不同位发生错误时,应该使余数不同。
D、对余数继续做除,应使余数循环。
校验码位数CRC校验码位数= 生成多项式位数- 1。
注意有些生成多项式的简记式中将生成多项式的最高位1省略了。
标准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原理可以利用多项式计算结果,以及异或运算,来检验数据的完整性,也被称为循环冗余检验(Cyclic Redundancy Check)。
CRC原理是一种数学理论,它可以检测出在传输过程中可能出现的数据错误,以及数据改变的情况。
它使用一个特殊的“编码”,将原始数据加上一个校验和(checksum),形成一个具有特殊意义的字符串,然后将这个字符串通过网络进行传输。
CRC原理的主要运作原理如下:(1)把数据转换成二进制形式,并使用一个特定的编码生成一个多项式;(2)通过多项式计算出一个校验和(Checksum);(3)将校验和加到原始数据尾部,形成一个新的数据包;(4)发送者将这个新的数据包通过网络进行传输;(5)接收者收到数据包之后,将校验和和原始数据再次进行多项式计算,并用异或运算(XOR)来检测是否有错误;(6)如果计算结果和接收到的校验和相等,代表数据无误;(7)如果计算结果和接收到的校验和不等,则代表数据受到损坏或者修改。
例如,假设原始数据是“abcdefg”,则发送者可以使用特定的编码,将这个字符串转换成01100100110111101100000111101111的二进制形式,然后使用多项式计算出一个校验和,最后将校验和加到原始数据尾部,形成一个新的数据包,即01100100110111101100000111101111011010。
接收者收到这个数据包之后,将校验和剥离出来,将原始数据再次使用特定的编码转换成01100100110111101100000111101111,然后再使用多项式计算出一个校验和,最后将计算出的校验和和收到的校验和进行异或运算。
如果计算结果为0,则代表数据无误;如果计算结果不为0,则代表数据受到损坏或者修改。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 计算的就是移位和异或。