CRC32校验理解与实现
[技术栈]CRC校验原理及C#代码实现CRC16、CRC32计算FCS校验码
![[技术栈]CRC校验原理及C#代码实现CRC16、CRC32计算FCS校验码](https://img.taocdn.com/s3/m/0bc92025cec789eb172ded630b1c59eef8c79a88.png)
[技术栈]CRC校验原理及C#代码实现CRC16、CRC32计算FCS校验码1.CRC、FCS是什么CRC,全称Cyclic Redundancy Check,中⽂名称为循环冗余校验,是⼀种根据⽹络数据包或计算机⽂件等数据产⽣简短固定位数校验码的⼀种信道编码技术,主要⽤来检测或校验数据传输或者保存后可能出现的错误。
它是利⽤除法及余数的原理来作错误侦测的。
FCS,全称Frame Check Sequence,中⽂名称为帧校验序列,俗称帧尾,即计算机⽹络数据链路层的协议数据单元(帧)的尾部字段,是⼀段4个字节的循环冗余校验码。
注:CRC循环冗余校验和FCS帧校验序列是单独的概念,CRC是⼀种错误校验⽅法,FCS是帧尾校验码,FCS可以采⽤CRC校验⽅法,也可以采⽤其他校验⽅法。
2.CRC算法原理我们可以把任意的⼀串⼆进制数据表⽰为⼀个与之对应的多项式。
⽐如:⼆进制数据:1100101多项式:x^6 + x^5 + x^2+1多项式:x^6 + x^4+x^3 + x^2+1⼆进制数据:1011101有了这样的对应关系,对⼆进制数据的CRC校验就可以利⽤多项式运算规则进⾏校验计算。
CRC校验算法正是采⽤了模2除法,在数据处理⾥的具体表现为异或运算。
CRC的具体运算规则为:假设要传输的⼆进制数据为:10010110,对应的m阶多项式为:M =x^7+x^4+x^2+x^1,除数为h阶的多项式为:H=x^4+x,对应的⼆进制码为:10010,先将M乘以x^h,即将M对应的⼆进制数据后⾯加h个0,然后除以h阶的多项式H,得到的h-1阶的余数项R对应的⼆进制数据即为数据10010110的CRC校验码。
3.计算CRC校验3.1.⼿⼯计算CRC校验码M和H的多项式除法运算,可以⽤模2除法运算计算。
下⾯为以⽣成多项式为H求10010110的CRC校验码运算过程:对应到异或运算:通过⽰例即其他⾃定义的⼀些数据运算后,根据运算现象总结可以得到⼀些规律:1.每次异或运算,当从左到右⾸位为1的时候,就与⽣成多项式H异或运算,然后再左移1位;当⾸位为0的时候只将数据左移1位。
c++ crc32计算原理

c++ crc32计算原理
CRC32是循环冗余校验(Cyclic Redundancy Check)的一种,
用于检测数据传输或存储过程中的错误。
CRC32计算原理涉及到多
项式除法和位操作。
首先,CRC32算法使用一个32位的寄存器来存储中间结果。
然后,数据被处理成一个比特流,每一位被依次处理。
CRC32算法使
用一个固定的多项式进行计算,通常是0xEDB88320。
在计算过程中,数据流的每一个比特被依次与寄存器中的值进行异或操作。
如果数
据流的当前比特为1,那么就将寄存器的值与多项式进行异或;如
果当前比特为0,则不进行异或操作。
接着,寄存器中的值向右移
动一位,将最右边的比特丢弃,最左边补0。
这个过程一直持续到
数据流的每一位都被处理完毕。
在处理完整个数据流后,寄存器中的值就是CRC32校验码。
需
要注意的是,在开始计算之前,寄存器中的初始值需要被设定为一
个特定的值,通常是0xFFFFFFFF。
此外,在最后输出CRC32值之前,需要对寄存器中的值进行一次取反操作。
总的来说,CRC32的计算原理涉及到多项式除法和位操作,通
过对数据流的每一位进行异或和移位操作,最终得到CRC32校验码。
这种算法的优点是计算简单高效,适合硬件实现和嵌入式系统应用。
java crc3216进制数校验算法

java crc3216进制数校验算法Java CRC32是一种校验算法,用于对数据进行校验和验证。
CRC32是循环冗余校验码的32位实现,它通过对数据进行多项式除法运算来生成一个32位的校验值。
本文将详细介绍Java CRC32算法的原理、应用及其实现方式。
一、CRC32校验算法原理CRC32算法是一种循环冗余校验码算法的32位实现。
它通过对数据进行多项式除法运算,得到一个32位的校验值。
具体的原理如下:1. 初始化CRC寄存器的值为全1(32个1)。
2. 将要校验的数据的每个字节与CRC寄存器的值进行异或运算。
3. 将CRC寄存器的值右移8位,并用一个预设的多项式(通常是0xEDB88320)进行异或运算。
4. 重复步骤2和3,直到所有的数据字节都被处理过。
5. 最终得到的CRC寄存器的值即为校验值。
二、CRC32校验算法应用CRC32校验算法在数据传输和存储中广泛应用,其中一些常见的应用包括:1. 数据完整性校验:通过计算数据的CRC32校验值,可以验证数据在传输或存储过程中是否发生了错误或损坏。
2. 文件校验:在下载文件或拷贝文件时,可以通过比较源文件和目标文件的CRC32校验值来判断文件是否完整无误。
3. 网络通信:在网络通信中,通过计算发送数据的CRC32校验值,接收方可以验证接收到的数据的完整性。
4. 数据库校验:在数据库中存储数据的同时,可以计算数据的CRC32校验值,并将其与存储的数据一起存储。
当需要读取数据时,可以通过比较计算得到的CRC32校验值和存储的校验值来验证数据的完整性。
三、Java CRC32算法实现Java提供了java.util.zip.CRC32类来实现CRC32校验算法。
下面是一个使用Java CRC32算法计算校验值的示例代码:```javaimport java.util.zip.CRC32;public class CRC32Example {public static void main(String[] args) {byte[] data = "Hello, CRC32!".getBytes();CRC32 crc32 = new CRC32();crc32.update(data);long checksum = crc32.getValue();System.out.println("CRC32 checksum: " + checksum);}}```在上述示例代码中,首先将要校验的数据转换为字节数组。
Java中循环冗余校验(CRC32)的实现

Java中循环冗余校验(CRC32)的实现前⾔本⽂主要给⼤家介绍了关于Java实现循环冗余校验(CRC32)的相关内容,分享出来供⼤家参考学习,下⾯话不多说了,来⼀起看看详细的介绍吧。
CRC32简介CRC校验实⽤程序库在数据存储和数据通讯领域,为了保证数据的正确,就不得不采⽤检错的⼿段。
在诸多检错⼿段中,CRC是最著名的⼀种。
CRC的全称是循环冗余校验。
CRC32检错能⼒极强,开销⼩,易于⽤编码器及检测电路实现。
从其检错能⼒来看,它所不能发现的错误的⼏率仅为0.0047%以下。
从性能上和开销上考虑,均远远优于奇偶校验及算术和校验等⽅式。
因⽽,在数据存储和数据通讯领域,CRC⽆处不在:著名的通讯协议X.25的FCS(帧检错序列)采⽤的是CRC-CCITT,ARJ、LHA等压缩⼯具软件采⽤的是CRC32,磁盘驱动器的读写采⽤了CRC16,通⽤的图像存储格式GIF、TIFF等也都⽤CRC作为检错⼿段。
CRC实现package com.jianggujin.codec;import java.io.IOException;import java.io.InputStream;import java.util.zip.CRC32;/*** CRC32** @author jianggujin**/public class HQCRC32{private static HQCRC32 crc32 = new HQCRC32();public static HQCRC32 getInstance(){return crc32;}private HQCRC32(){}private static final int STREAM_BUFFER_LENGTH = 1024;public long encrypt(byte[] data){CRC32 crc32 = new CRC32();crc32.update(data);return crc32.getValue();}public long encrypt(InputStream data) throws IOException{final byte[] buffer = new byte[STREAM_BUFFER_LENGTH];int read = data.read(buffer, 0, STREAM_BUFFER_LENGTH);CRC32 crc32 = new CRC32();while (read > -1){crc32.update(buffer, 0, read);read = data.read(buffer, 0, STREAM_BUFFER_LENGTH);}return crc32.getValue();}}测试代码:import org.junit.Test;import com.jianggujin.codec.HQCRC32;public class CRC32Test{HQCRC32 crc32 = HQCRC32.getInstance();@Testpublic void encode(){byte[] data = "jianggujin".getBytes();long result = crc32.encrypt(data);System.err.println(result);}}测试结果:724585211总结以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。
crc32算法与示例

crc32算法与示例CRC32算法是一种常用的校验算法,它可以用来验证数据的完整性。
本文将介绍CRC32算法的原理和示例,帮助读者理解并应用这一算法。
一、CRC32算法概述CRC32算法是循环冗余校验(Cyclic Redundancy Check)的一种变种。
它通过对数据进行多项式除法运算,得到一个32位的校验值。
这个校验值可以用来验证数据在传输或存储过程中是否发生了错误。
二、CRC32算法原理CRC32算法的核心思想是将数据看成一个二进制数,然后通过除法运算得到校验值。
具体步骤如下:1.选择一个32位的生成多项式,通常取0x04C11DB7。
2.将数据看成一个二进制数,按照最高位在前的顺序排列。
3.在数据的最高位补32个0,得到一个新的二进制数。
4.用生成多项式除以这个新的二进制数,得到余数。
5.将余数作为校验值。
三、CRC32算法示例为了更好地理解CRC32算法,下面举一个简单的示例。
假设我们要发送一个包含4个字节的数据:0x01 0x02 0x03 0x04。
1.我们首先选择生成多项式0x04C11DB7。
2.将数据看成一个二进制数,按照最高位在前的顺序排列得到:00000001 00000010 00000011 00000100。
3.在数据的最高位补32个0,得到一个新的二进制数:00000000 00000000 00000000 00000001 00000000 00000010 00000011 00000100。
4.用生成多项式0x04C11DB7除以这个新的二进制数,得到余数为0x0C9F 0x9C3B。
5.将余数0x0C9F 0x9C3B作为校验值。
因此,经过CRC32算法计算,数据0x01 0x02 0x03 0x04的校验值为0x0C9F 0x9C3B。
四、CRC32算法应用举例CRC32算法广泛应用于数据传输和存储的过程中,用于验证数据的完整性。
例如,在网络传输中,发送方可以通过计算数据的CRC32值,将其附加在数据后面一起发送。
crc32 c语言运算实现

crc32 c语言运算实现摘要:1.CRC32 的概述2.C 语言实现CRC32 的方法3.CRC32 的具体运算过程4.CRC32 在实际应用中的例子5.总结正文:【1.CRC32 的概述】CRC32,全称为Cyclic Redundancy Check 32,即32 位循环冗余校验,是一种用于数据传输过程中检测错误的技术。
通过在数据后面附加一些校验位,然后接收方在接收到数据后,通过相同的计算方法,对数据进行校验,以判断数据在传输过程中是否发生了改变或错误。
【2.C 语言实现CRC32 的方法】CRC32 的计算方法有多种,其中较为常见的是使用查表法和公式法。
在C 语言中,可以通过以下步骤实现CRC32 的计算:1) 首先,需要定义一个256x32 的查错表,用于存储CRC32 的值。
2) 然后,根据待计算的数据,查找查错表,得到对应的CRC32 值。
3) 最后,将该值附加在数据的后面,形成一个新的数据。
【3.CRC32 的具体运算过程】以查表法为例,假设待计算的数据为1101,首先找到该数据在查错表中的位置,然后查表得到对应的CRC32 值为0x00000000。
接着,将该值附加在数据的后面,得到新的数据为1101000000。
此时,再对这个新的数据进行CRC32 的计算,直到整个数据长度达到32 位。
这样就可以得到最终的CRC32 校验值。
【4.CRC32 在实际应用中的例子】在实际应用中,CRC32 广泛应用于数据传输、文件存储等场景。
例如,在网络数据传输中,为了保证数据的完整性,可以在数据后面附加CRC32 校验值。
接收方在接收到数据后,通过计算CRC32,判断数据是否发生了改变或错误。
【5.总结】CRC32 是一种重要的数据校验技术,通过在数据后面附加校验位,然后接收方在接收到数据后,通过相同的计算方法,对数据进行校验,以判断数据在传输过程中是否发生了改变或错误。
crc32算法原理

crc32算法原理
CRC32(Cyclic Redundancy Check 32)是一种常用的数据链路层校验码算法,被用来检测工作中的某些数据传输时产生的应用数据包错误。
它通常用于检测数据是否被损坏,或者是否被发送正确。
该算法在获取数据链接块的校验值时,可以有效地验证数据的完整性,并减少数据传输当中出现的疏漏。
CRC32是一种以多项式的方式进行循环冗余检查的技术,其校验过程完全独
立于输入数据,且可以识别到信息位或者操作位的任何差错。
在确定两个数据体是否一致时,通过比较CRC32校验值即可快速判断。
这种算法几乎每一次都能检测出比特级别的错误,可以有效地抵御和找出各种形式的数据错误,包括几十个比特位的错误,并可以给出相应的明确的提示,而且其计算量比哈希函数要小的多。
CRC32的工作原理主要是将检测的数据块中的每一位抽取出来,经过处理,
与多项式进行逐位按位比较,并产生一个固定长度的校验码。
当校验时,会先将比较者数据块中的每一位抽取出来,并与校验码进行逐位按位比较,如果输出值为零,则表明该数据块在传输过程中未发生任何差错。
CRC32是一种简单而又有效的校验码算法,应用广泛。
它可以防止大多数突
发性错误,实现快速而准确的数据校验,加剧了由不可靠的信源发出的数据的可信度,被用于中心数据处理设备或数据传输设备,也广泛地用于各种存储器或软件上的安全校验。
CRC16、CRC32校验简单分析

CRC16校验分析工业通讯中传输的数据一般是先传数据字节的低位,如:实际DATA 0x38 (0011 1000) 接收端收到为0001 1100 (0x1C),所以大部分CRC校验是处理颠倒的字节数据。
有的多项式简式为0x1021(本文以0x8005为主),目前主要的CRC算法有查表法和直接计算:1.直接计算由于数据是颠倒的所以生成项亦要倒置:0xa001(原生成多项式CRC码为0x18005,最高位始终为1故简写为0x8005,反置得到0xa001。
计算CRC时也要从其低位开始运算,且计算中数据右移(移出高位)。
异或运算满足交换律:(A^B)^C=A^(B^C),下面分析其中一种简单算法:C语言计算:计算时一次计算8bits,数据与CRC生成多项式(简式)相除,除不尽的余数与下8bits数据再异或(相减),接着进入下一8bits计算。
直到len长的数据全部计算完。
2.查表法:通过分别计算8bits(查表得到其余式)来实现逐个字节数据的CRC计算,直到全部字节数据计算完最后的余式就是CRC。
下面全是8bits查询表(256个余式的表),不过也可以4bits查询一次的计算(这样表里只需16个余式).先看程序的算法:r=0; //r是寄存器,先初始化为0//p0),t是查询表字节数据查询r高8位对应的余式,再与新得到的式子异或数据计算示意图:,之后再重复上面的步骤……若待测数据未扩展0,则此时还要计算4字节扩展0的CRC:构造CRC32查询表:一般来说,计算CRC是用“直驱表法”算法计算的,它与上面的算法非常相似,下面分析它的计算:计算步骤为(摘自文献):1. Shift the register left by one byte2. XOR the top byte just rotated out of the register with the next message byteto yield an index into the table ([0,255]).3. XOR the table value into the register.4. Goto 1 iff more augmented message bytes.C语言算法为:r=0; //r是寄存器,先初始化为0while (len--) //len是待测数据(不用扩展0)的字节长度r = (r<<8) ^ t[(r >> 24) ^ *p++]; //p是指向待测数据的指针,t是查询表相当于通过移位处理了8 个bit 的数据,相当于把之前的CRC 码的高字节(8bit)全部移出,与一个byte 的数据做XOR 运算,根据运算结果来选择一个值(称为余式),与原来的CRC 码再做一次XOR 运算,就可以得到新的CRC 码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、CRC的作用
CRC的英文全称为Cyclic Redundancy Check(Code),中文名称为循环冗余校验(码)。
它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差错控制。
二、CRC的原理
(一)CRC的校验过程描述
1、被校验的原数据转换成二进制序列,假设共K位
2、以一定规则产生一个新的二进制序列,假设共R位的。
3、把新的二进制序列附加在原数据二进制序列后面,共K+R位,发送出去。
4、接收端接收数据后,把原数据的K位二进制序列按相同规则产生一个R位二进
制序列与附加的R位二进制序列进行比较,相同表示传递的数据没有问题,不
相同表示传递的数据出现错误与误差。
(二)CRC的校验码生成过程描述
其中对二进制序列的转换规则是CRC中的关键。
校验规则规则描述如下:
1、首先把原数据二进制序列可以看成一个多项式,比如10011看成多项式x4+x1+
1,其中多项式系数只能是0,1。
2、然后定义一个规则,也是使用多项式,这个多项式专业名称叫生成多项式。
其
系数也只能是0,1。
3、使用原数据对应的多项式除以生成多项式,得到一个余数多项式。
其系数也只
能是0,1。
4、余数多项式的系数转换成一个二进制,这就是CRC校验码。
(三)CRC生成多项式说明
CRC-32使用的就是上面最高指数为32的多项式,对应的二进制序列是100000100110000010001110110110111。
(四)CRC多项式除法规则
在一般的除法中,都使用的是减运算,但在CRC多项式除法运算中使用的是异或运算。
(五)CRC原理实例说明
下面使用一个实例说明校验码生成及其除法规则。
已知原始数据的二进制序列是1010,采用的生成多项式是CRC-8类型100000111。
原始数据对应的多项式是t(x)=x3+x1,生成多项式是G(x)=x8+
x2+x1+1。
大家可以看到上面的一个现象,就是不用除了,原数据对应的二进制序列对应
的多项式就已经是余数多项式了,这样CRC运算就没有意义了。
所以要保证每一位都能进行运算,需要对在原始数据的二进制序列后加若干0,0的个数由生成多项式的最高指数(阶数)决定,这里就是补充8个0,原数据二进制序列变成101000000000,对应对多项式就是x8t(x)=x11+x9。
这样可以保证CRC除法至少进行一次。
除法过程如下图示:
结果是110110,对应多项式是x5+x4+x2+x1
校验码是110110。
(六)CRC的算法
上面的原理转换成程序还是比较难的,所以需要把上面过程转换成算法,同时在该算法基础上提出了很多优化算法,比如查表算法。
计算机硬件已经实现了CRC的算法,对CRC-8其中使用寄存器8个,异或运算三个。
因为CRC-8 的生成多项式是x8+x2+x1+1,其中R0表示常数项1,R1表示x1,R2表示x2。
多项式中的连续两项之间对应一个异或运算。
记住R7到R0是连续的两项。
R0,R1,R2,R3,R4,R5,R6,R7是8个寄存器,如果采用32,需要32个寄存器。
其中的异或运算的位置根据生成多项式来确定。
下面八上面的图示的过程转换成算法描述:
1、寄存器全部初始化为0。
2、每次位移全部进行。
3、其中的异或操作的输入需要两个位,其中一位是R7的移出位,另外一个就是
右边的异或运算输出。
4、结束条件是原数据位都进行了输入。
运算步骤过程图示:
结果与前面多项式余数一样都是110110 三、CRC的实现
下面采用伪代码的方式说明算法:。