计算法简单实现crc校验
CRC校验算法详解及代码实现
CRC校验算法详解及代码实现CRC校验算法的原理是利用生成多项式来计算数据的校验值。
在发送端,将数据和生成多项式进行计算得到一个校验值,然后将这个校验值附加到发送的数据后面一起传输。
在接收端,接收到数据后再次进行计算,并与接收到的校验值进行比较,如果相同则说明数据传输过程中没有错误,否则说明数据传输过程中出现错误。
下面是CRC校验算法的具体步骤:1.选择一个生成多项式,通常用一个二进制数表示。
生成多项式的位数称为CRC位数,常见的有CRC-8,CRC-16,CRC-32等。
2.将生成多项式的最高位与数据的最高位对齐,然后进行异或运算。
异或运算的结果作为下一次异或运算的输入,直到将所有数据都计算完毕。
3.将计算得到的结果作为校验值附加到数据后面一起传输。
下面是一个简单的CRC校验算法的代码实现:```pythondef crc(data, generator):crc_value = 0generator_length = len(generator)for bit in data:crc_value ^= bitif crc_value & 0x1:crc_value = (crc_value >> 1) ^ int(generator, 2)else:crc_value = crc_value >> 1return crc_value#测试数据data = [1, 0, 1, 1]generator = "1011"#进行CRC校验residue = crc(data, generator)print(residue)```在上面的代码中,`data`表示要进行校验的数据,以列表的形式表示,每个元素是一个二进制位。
`generator`表示生成多项式,以字符串的形式表示,每个字符是一个二进制位。
程序输出的结果为校验值。
总结:本文详细介绍了CRC校验算法的原理和步骤,并给出了一个简单的代码实现。
CRC原理及计算示例
CRC原理及计算⽰例
推荐博⽂:
1、CRC原理:
2、CRC校验码的计算⽰例:
除数是随机数或按标准选定,CRC的关键是如何求出余数(CRC校验码)。
假设选择的CRC⽣成多项式为G(x)=x^4+x^3+1 要求计算出⼆进制的序列10110011的CRC校验码。
(1)、
将多项式转为⼆进制数,由G(x)=x^4+x^3+1得知,⼀共5位(总位数=最⾼位的幂次+1,即4+1=5)根据多项式的含义(多项式只列出⼆进制值为1的位,也就是这个⼆进制的第4位、第3位、第0位的⼆进制均为1,其它位均为0,所有⼆进制的⽐特串(除数)为11001
(2)、
A.原数帧:10110011
B.除数:11001 (5位数)
C.新数帧:在原数据帧后⾯补上(除数总位数-1个)0 ----> 10110011 0000
D.CRC校验码:C/B的余数,余数的位数只能⽐B少⼀位不够在左边补0,------> 10110011 0000/11001 = 100(这⾥只有三位,所以需要在100左边补0为 0100)
E.新发送帧:在A后⾯加上D(10110011 0100), 接收端收到E,使⽤E/B看是否有余数,如果没有余数则表明该帧在传输过程中没有出错,否则出了差错 -----> 10110011 0100/11001 =10101000余数为0。
C语言实现CRC校验(多种方法)
}
上面的程序根据运算分析而来,很容易理解。为了节约内存空间,我们对程序作进一步的简化。分析可知,当二进制序列中上一位计算的余数第15bit位为1时,即( 上一位计算的余数 & 0x8000) != 0,计算本位时,上一位余数 * 2后可对0x11021作求余运算,然后再加上本位计算所得余数。这个很好理解,也就是说,打个比方,把它看作简单的除法,计算上一位时的余数乘以2后,如果比较大可以当被除数,就再去除除数求余。有一点和普通除法不同的是,因为多项式除法中采用不带借位的减法运算,所以0x10000也可以被0x11021除,余数并非为0x10000,而是0x1021。这个自己动手算一下就知道了。余数之和也是不带进位的加法运算,即异或。最后还强调一点,因为二进制序列是左移16位后参与运算的,所以,一直算到序列的最后一位也是可以被除的,这点大家要明白。下面给出简化后的C语言实现。
2、按位计算CRC
采用CRC-CCITT多项式,多项式为0x11021,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) + ……
CRC校验码的原理
CRC校验码的原理CRC(Cyclic Redundancy Check)是一种常用的校验码,用于检测数据传输中的错误。
CRC校验码的原理是通过对数据进行计算,生成一个校验码,并将其附加到原始数据中一起传输。
接收方在收到数据后,通过重新计算校验码,并将其与接收到的校验码进行比较,以判断数据是否发生了错误。
1.选择一个固定长度的除数,通常称为生成多项式。
2.将生成多项式左移一个比特位,然后与数据的首个比特位进行“异或”操作。
结果称为“临时商”。
3.将数据向左移动一个比特位,并将上一步计算得到的临时商与下一个比特位进行“异或”操作,生成新的临时商。
4.重复上述过程,直到处理完数据的所有比特位。
5.将计算得到的临时商添加到原始数据的末尾作为校验码。
接收方收到数据后也按照相同的生成多项式重新进行CRC计算,然后将计算得到的临时商与接收到的校验码进行比较。
如果两者相等,说明数据没有发生错误;如果不相等,说明数据发生了错误。
在这种情况下,接收方可以要求发送方重新发送数据。
1.高效性:CRC校验码通常能够检测出大多数单比特和多比特的错误,很少漏掉错误。
2.易于实现:CRC校验码的计算过程可以通过硬件电路或软件算法来实现,非常简单直观。
3.不可逆性:CRC校验码不能完全确定数据中的错误位置和错误数量,而仅能检测错误。
4.灵活性:可以根据需要选择不同的生成多项式,以适应不同的数据传输环境。
需要注意的是,CRC校验码并不能检测所有的错误,特别是在数据传输距离较长、传输介质质量较差或噪声较多的情况下,仍然可能发生传输错误。
因此,在实际应用中,需要根据具体情况选择合适的校验码和纠错方法来保证数据传输的可靠性。
crc16校验码的计算方法
crc16校验码的计算方法CRC16校验码是一种常用的校验码算法,主要用于数据传输的错误检测。
它通过对待校验的数据进行计算,生成一个16位的校验码,然后将校验码附加在数据后面进行传输。
接收方在接收到数据后,同样使用CRC16算法对数据进行计算,并将计算得到的校验码与接收到的校验码进行比较,如果两者一致,说明数据传输没有错误。
CRC16校验码的计算方法可以分为以下几个步骤:1. 初始化CRC寄存器:将CRC寄存器的值初始化为一个固定的值,通常为0xFFFF。
2. 逐位计算:从数据的最高位开始,依次对每一位进行计算。
首先,将CRC寄存器的最高位与当前数据位进行异或操作,然后将CRC 寄存器的值左移一位。
3. 检查最高位:如果左移后CRC寄存器的最高位为1,则将CRC 寄存器的值与一个预设的固定值(通常为0x8005)进行异或操作。
4. 继续计算:重复步骤2和步骤3,直到对数据的每一位都进行了计算。
5. 结果取反:将CRC寄存器的值取反,得到最终的CRC16校验码。
下面以一个简单的例子来说明CRC16校验码的计算过程。
假设我们要计算数据0x0123的CRC16校验码。
1. 初始化CRC寄存器为0xFFFF。
2. 逐位计算:首先将CRC寄存器的最高位(0xFFFF的最高位为1)与数据的最高位(0x0的最高位为0)进行异或操作,得到1。
然后将CRC寄存器左移一位,得到0xFFFE。
3. 检查最高位:左移后CRC寄存器的最高位为1,将CRC寄存器的值与0x8005进行异或操作,得到0x7FFB。
4. 继续计算:重复步骤2和步骤3,对数据的每一位都进行计算。
最终得到CRC寄存器的值为0x7FFB。
5. 结果取反:将CRC寄存器的值取反,得到最终的CRC16校验码为0x8004。
通过以上计算,我们得到了数据0x0123的CRC16校验码为0x8004。
在实际应用中,发送方将数据和校验码一起发送给接收方,接收方在接收到数据后进行校验,如果计算得到的校验码与接收到的校验码一致,说明数据传输没有错误;如果不一致,则说明数据传输存在错误。
CRC_校验码的计算方法
CRC 校验码的计算方法CRC从原理到实现===============作者:Spark Huang(hcpp@)日期:2004/12/8摘要:CRC(Cyclic Redundancy Check)被广泛用于数据通信过程中的差错检测,具有很强的检错能力。
本文详细介绍了CRC的基本原理,并且按照解释通行的查表算法的由来的思路介绍了各种具体的实现方法。
1.差错检测数据通信中,接收端需要检测在传输过程中是否发生差错,常用的技术有奇偶校验(Parity Check),校验和(Checksum)和CRC(Cyclic Redundancy Check)。
它们都是发送端对消息按照某种算法计算出校验码,然后将校验码和消息一起发送到接收端。
接收端对接收到的消息按照相同算法得出校验码,再与接收到的校验码比较,以判断接收到消息是否正确。
奇偶校验只需要1位校验码,其计算方法也很简单。
以奇检验为例,发送端只需要对所有消息位进行异或运算,得出的值如果是0,则校验码为1,否则为0。
接收端可以对消息进行相同计算,然后比较校验码。
也可以对消息连同校验码一起计算,若值是0则有差错,否则校验通过。
通常说奇偶校验可以检测出1位差错,实际上它可以检测出任何奇数位差错。
校验和的思想也很简单,将传输的消息当成8位(或16/32位)整数的序列,将这些整数加起来而得出校验码,该校验码也叫校验和。
校验和被用在IP协议中,按照16位整数运算,而且其MSB(Most Significant Bit)的进位被加到结果中。
显然,奇偶校验和校验和都有明显的不足。
奇偶校验不能检测出偶数位差错。
对于校验和,如果整数序列中有两个整数出错,一个增加了一定的值,另一个减小了相同的值,这种差错就检测不出来。
2.CRC算法的基本原理-------------------CRC算法的是以GF(2)(2元素伽罗瓦域)多项式算术为数学基础的,听起来很恐怖,但实际上它的主要特点和运算规则是很好理解的。
C语言实现CRC校验
C语言实现CRC校验1.按位计算法:按位计算是一种基本的CRC校验方法。
实现步骤如下:1)定义一个用于存储CRC校验结果的变量(通常是一个无符号整数)并初始化为零。
2)将待校验的数据按位划分。
3)逐位处理每个划分的数据,以异或运算(^)与之前计算得到的CRC结果进行计算,直到处理完所有数据。
4)最终得到的CRC校验结果即为校验码。
示例代码如下:```c#include <stdio.h>unsigned int calculateCRC(unsigned char *data, int size)unsigned int crc = 0;for (int i = 0; i < size; i++)crc ^= data[i] << 8;for (int bit = 0; bit < 8; bit++)if ((crc & 0x8000) != 0)crc = (crc << 1) ^ 0x1021;} elsecrc <<= 1;}}}return crc;int maiunsigned char data[] = {0x01, 0x02, 0x03, 0x04, 0x05};int size = sizeof(data) / sizeof(data[0]);unsigned int crc = calculateCRC(data, size);printf("CRC: 0x%04X\n", crc);return 0;```上述代码中,`calculateCRC`函数用于计算CRC校验结果,接受一个指向待校验数据的指针和数据长度作为参数。
`main`函数通过调用`calculateCRC`函数计算CRC校验结果,并使用`printf`函数打印结果。
2.查表法:查表法是另一种常用的CRC校验算法,通过建立一个查找表来提高计算效率。
CRC校验的概念及具体实现
CRC校验的概念及具体实现概念CRC(Cyclic redundancy check),循环冗余校验CRC校验是⽤于检测⼀帧数据发送是否正确,只有确认对错的作⽤,并没有纠错的能⼒。
还有⼀点就是CRC校验通过了,并不代表这个数据肯定就是正确的,只能说尽可能减少出错的概率,当然CRC错了那么这个数据肯定是不正确的。
⽽这个概率是跟CRC的位数相关,也跟选择的多项式有关,⼤致可以理解为CRC8,就是1/(28),CRC16则是1/(216)以此类推。
对于检验⼀帧数据是否正确有很多算法,CRC只是其中的⼀种,SUM的形式也可以的,只是算法不同对于校验结果的效果也是不⼀样的,最好的效果是,每⼀位的变化都可以引起最终checksum的值发⽣较⼤的改变。
引⼊除法计算是⼀种很好的⽅法,每⼀位发⽣改变对于最后的余数都会引起较⼤的变化。
多项式(Polynomical)多项式即CRC除法的除数,⽽且多项式是总于⾼于CRCN中N的⼀位,这样可以保证余数的位数与N相同。
同时多项式也有好坏之分,区别就是在于出错的概率,⾄于哪种多项式好⼀些,这个⼀般来说是数学家的事情,我们⼯程上拿过来⽤就好,⽽且⼀般的协议中也已经规定了这个CRC的多项式。
其实多项式只是⼀种表现⽅式,当然也可以直接⽤16进制表⽰以CRC-CCITT为例x16+x12+x5+1也可以表⽰为0x1021计算例⼦引⽤别⼈⽂档中的例⼦来说明CRC机制,如下是⼀个CRC4计算的例⼦1100001010 = Quotient (nobody cares about the quotient)_______________10011 ) 11010110110000 = Augmented message (1101011011 + 0000)=Poly 10011,,.,,....-----,,.,,....10011,.,,....10011,.,,....-----,.,,....00001.,,....00000.,,....-----.,,....00010,,....00000,,....-----,,....00101,....00000,....-----,....01011....00000....-----....10110...10011...-----...01010..00000..-----..10100.10011.-----.0111000000-----1110 = Remainder = THE CHECKSUM先将要计算的后⽅填充相应位数的0(CRC4,4位),再对POLY进⾏求余操作,这个余数就是我们要的checksum这个操作就是⼀个除法操作,只是在减的时候⽤XOR来代替减法,这样就不要考虑进位借位的问题,⽽且XOR来代替减法也不会使CRC的效果变差,因为每⼀位的改变还是会引起checksum较⼤的变化。
crc校验公式
crc校验公式摘要:1.CRC 校验公式概述2.CRC 校验公式的计算方法3.CRC 校验公式的应用实例4.总结正文:1.CRC 校验公式概述CRC(Cyclic Redundancy Check,循环冗余校验)是一种基于二进制多项式的数据传输错误检测技术。
CRC 校验公式是用于计算CRC 校验码的数学公式,通过对数据包进行编码,然后在接收端进行解码,从而检测数据传输过程中是否发生了错误。
CRC 校验公式具有简单、易于实现和可靠性高的特点,广泛应用于数据通信、存储设备等领域。
2.CRC 校验公式的计算方法CRC 校验公式的计算过程主要分为以下几个步骤:(1)首先确定要发送的数据(简称数据A),以及生成CRC 校验码的二进制多项式(简称生成多项式B)。
(2)将数据A 左移B 的位数,得到一个新的数据A"。
(3)计算A"除以B 的余数,记为R。
(4)将R 作为CRC 校验码,附加在数据A 的后面,形成一个新的数据包。
在接收端,使用相同的生成多项式B,对接收到的数据包进行相同的计算过程,从而得到接收端计算出的CRC 校验码。
然后将接收端计算出的CRC 校验码与发送端附加的CRC 校验码进行比较,如果二者相同,则认为数据传输正确;如果不同,则认为数据传输发生错误。
3.CRC 校验公式的应用实例CRC 校验公式广泛应用于各种数据通信和存储设备中,例如:(1)以太网:以太网是一种局域网技术,它使用CRC 校验公式来检测数据帧在传输过程中是否发生错误。
(2)硬盘驱动器:硬盘驱动器在存储数据时,使用CRC 校验公式来检测数据是否正确写入。
(3)无线通信:CRC 校验公式被广泛应用于各种无线通信技术中,如蓝牙、Wi-Fi 等。
4.总结CRC 校验公式是一种简单、易于实现且可靠性高的数据传输错误检测技术。
通过对数据包进行编码和解码,CRC 校验公式可以有效地检测数据传输过程中是否发生了错误。
crc校验码计算
crc校验码计算
CRC校验码(Cyclic Redundancy Check,即循环冗余校验)是一
种数据传输中用来检查错误的技术,可以把多余的数据发送到接收到
的机器,并将期望的结果通过校验码进行比较,以检查在传输过程中
是否出现错误。
要计算CRC,首先需要将数据分割成一系列字节,然后用这些字节填充一个n位的CRC字段,n的大小取决于想要获取的校验码的精确度。
接下来,需要使用一些特定的位并将每个字节与位进行异或操作,以
计算出校验码。
其实,CRC校验码计算过程并不复杂,基本操作可以分成三步:
(1)将一个信息帧中的所有字节按一定的次序排列;
(2)以某一特定的模数,将这些字节与一个特定的多项式进行运算;
(3)把结果值放入CRC校验码字段,该值用于表示这一帧中任何
字节出现错误的几率是多少。
有了这样的计算表达式,对于一个给定的数据流,按上面的步骤,经过一些固定的运算,就能计算出一个CRC校验码。
而当接收方收到
数据后,也可以按同样的计算过程,计算出一个收到的CRC校验码。
接收方只需比较接收到的CRC校验码与计算出来的CRC校验码是否一致,就能判断数据是否发送过程中出现错误。
当然,CRC校验码有其自身的特点,它能够检查给定数据中比原数据本身更多的数据,可以检测比1位误码更多的多位误码,具有比校
验和的可靠性更高的优点。
crc校验的方法
crc校验的方法
CRC(CyclicRedundancyCheck)校验是一种常用的错误检测方法,它可以在数据传输过程中检测出单比特或多比特的差错。
CRC校验的基本原理是通过生成多项式除法来计算校验码。
以下是CRC校验的基本步骤:
1.选择生成多项式:首先需要选择一个生成多项式,通常使用二进制形式表示。
生成多项式的位数决定了校验码的长度。
常用的生成多项式有CRC-8、CRC-16和CRC-32等。
2.初始化寄存器:将寄存器初始化为全0。
3.逐位计算:按照从高位到低位的顺序,依次对待发送的数据进行处理。
-如果当前位是1,则将寄存器与生成多项式进行异或操作。
-然后将寄存器向右移动一位,最高位补零。
4.处理完所有数据后,得到的寄存器值即为校验码。
5.将校验码附加到待发送的数据后面。
6.接收端收到数据后,同样按照相同的生成多项式进行校验计算。
如果计算出的校验码与接收到的校验码一致,则认为数据没有发生错误;如果不一致,则认为数据可能存在错误。
CRC校验具有简单、高效的特点,能够检测出大部分常见的传输错误。
然而,CRC校验并不能纠正错误,只能检测出错误的存在。
在实际应用中,CRC校验通常与其他纠错方法(如重发请求)结合使用,以提高数据传输的可靠性。
1。
crc校验算法计算过程
crc校验算法计算过程CRC(CyclicRedundancyCheck)循环冗余校验算法是在数据传输过程中应用的一种工具,有效的检测接收到的数据中只有很小的概率发生数据传输错误的情况,是目前应用最广泛的数据错误检测算法之一。
CRC算法可以将错误检测任务减少到接近于理想化的水平,针对随机等可能发生错误的计算机系统,它能够检测出所有位数不超过2k-1位的二进制错误,并能够检测出99.998%的随机等应用错误。
CRC校验算法计算过程主要包括四个步骤:1.将待校验的二进制数据段与预先设定的多项式进行按位模2的乘法运算,得到一个多项式结果。
2.将乘法结果按照CRC算法要求进行右移和异或运算,进行除法运算,得到的余数称为CRC码,即为所要求的校验位。
3.在发送时,将数据段与CRC码连接在一起,一起发给接收方。
4.接收方接收到报文后,将报文与CRC码分离,对数据段进行校验,并重复上述运算,得到CRC码,比较两者是否相等,以确定数据是否正确地传输到接收方。
CRC校验算法是在数据传输过程中应用的一种工具,可以有效地检测数据传输中只有很小概率发生的错误,是很多计算机系统的重要保证。
这里以一个简单的例子来说明CRC算法的计算过程。
假设有一个原始数据段是“11010010”,预先设定的要求多项式是“10001001”,那么CRC算法计算过程如下:1.将“11010010”按位与“10001001”进行乘法运算(即模2加法),得到结果是“01001001”。
2.将乘法运算结果按CRC算法的要求,右移一位,再将右移的结果和“10001001”进行异或,得到结果是“00001101”。
3.将两者再次右移一位,再将右移的结果和多项式“10001001”进行异或,得到结果是“00110001”。
4.再进行两次右移,再将右移的结果和多项式“10001001”进行异或,得到结果是“11001000”,这就是所要求的CRC码。
以上便是CRC算法的计算过程,可以看出,CRC算法是一个非常简单而又高效的数据错误检测算法。
CRC校验码的原理
CRC校验码的原理CRC(Cyclic Redundancy Check)校验码是一种常用的错误检测码,用于检测数据传输中的错误。
它通过在数据传输过程中附加一定长度的校验码,并在接收端重新计算校验码来判断数据是否传输正确。
CRC校验码的原理基于多项式除法。
具体来说,CRC校验码通过将原始数据与一个预定的生成多项式进行除法运算得到校验码。
生成多项式的系数决定了CRC校验码的长度,通常用于CRC校验的生成多项式是众多经典多项式中的一种,比如CRC-8、CRC-16、CRC-32等。
1.生成:a.选择一个生成多项式,该多项式的位数决定了校验码的位数,比如CRC-16使用的是16位多项式;b.将要传输的数据按照一定的规则与生成多项式进行除法运算;c.得到的余数就是CRC校验码;d.将CRC校验码附加到要传输的数据后面,传输整个数据包。
2.校验:a.接收端接收到数据包后,按照与生成端相同的生成多项式和除法规则对接收到的数据进行除法运算;b.若得到的余数为0,说明数据传输正确,否则数据传输错误。
以CRC-16为例,它使用的生成多项式是x^16+x^15+x^2+1,表示为0x8005、在传输端,将要传输的数据和该生成多项式进行除法运算,得到的余数作为CRC校验码附加到传输数据后面。
在接收端,接收到数据后使用相同的生成多项式进行除法运算,若余数为0则说明传输正确,否则传输错误。
1.强大的错误检测能力:CRC校验码在有限的代码位数下能够捕捉到很多常见的传输错误,包括单比特错误、双比特错误、任意奇数个比特错误等。
2.算法简单:CRC校验码的生成和校验算法相对简单,可以通过硬件和软件实现,不占用过多的计算资源。
3.高效性能:CRC校验码生成和校验的时间复杂度都为O(n),其中n 是数据位数,因此具有较高的效率。
总的来说,CRC校验码是一种广泛应用于数据传输中的错误检测码,通过通过生成和校验过程,能够有效地检测传输中产生的错误,保证数据的可靠性。
crc校验算法案例
crc校验算法案例CRC校验算法是一种常用的数据校验方法,它通过计算数据的校验值来检测数据传输过程中是否发生了错误。
在本文中,我们将以实际案例的形式介绍CRC校验算法的原理、应用和实现。
案例1:通信传输中的CRC校验假设某个通信系统中,发送端需要将一段数据通过信道传输给接收端,为了保证数据的可靠性,发送端在数据末尾添加了一个CRC校验码。
接收端在接收到数据后,会对接收到的数据进行CRC校验,以确定数据是否传输正确。
如果校验结果与接收到的CRC校验码一致,则认为数据传输正确,否则认为数据传输发生错误。
案例2:计算机存储中的CRC校验在计算机存储中,CRC校验也被广泛应用。
例如,在硬盘中存储的数据经常会受到磁头的干扰,导致数据发生位错误。
为了保证数据的可靠性,硬盘会在存储数据时,为每个数据块计算并存储一个CRC校验码。
在读取数据时,硬盘会重新计算数据的CRC校验码,并与存储的校验码进行比较,以确定数据是否发生了位错误。
案例3:网络通信中的CRC校验在网络通信中,CRC校验算法被广泛应用于数据包的传输。
例如,在以太网中,每个数据包都会附带一个CRC校验码,在接收端对数据包进行校验时,会重新计算数据的CRC校验码,并与接收到的校验码进行比较,以确定数据是否传输正确。
案例4:无线通信中的CRC校验在无线通信中,由于信道的不稳定性,数据传输往往会受到干扰,导致数据错误。
为了保证数据的可靠性,无线通信系统常常会使用CRC校验算法对数据进行校验。
发送端在发送数据时,会计算数据的CRC校验码并附加在数据中,接收端在接收数据时,会对接收到的数据进行CRC校验,以确定数据是否传输正确。
案例5:存储介质中的CRC校验在存储介质中,如磁带、光盘等,数据的可靠性是非常重要的。
为了保证数据的可靠性,这些存储介质会使用CRC校验算法对存储的数据进行校验。
在读取数据时,存储介质会计算数据的CRC校验码,并与存储的校验码进行比较,以确定数据是否发生了错误。
CRC校验C语言实现
CRC-32: G(X) = X32 + X26 + X23 + X22 + X16 +X12 + X11 + X10 + X8 + X7 + X5 + X4 + X2 + X1 + 1
2、按位计算 CRC
采用 CRC-CCITT 多项式,多项式为 0x11021,C 语言编程时,参与计算为 0x1021,这个地方得深入思
法运算,即异或。最后还强调一点,因为二进制序列是左移 16 位后参与运算的,所以,一直算到序列的最
后一位也是可以被除的,这点大家要明白。下面给出简化后的 C 语言实现。
unsigned
char
test[16]
={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee制分序列求余数,竖式除法即为 0x10000 ^ 0x11021 运算,后面的 0 位保留;
<2>接着对第二个二进制分序列求余数,将第一步运算的余数*2 后再和第二个二进制分序列一起对
0x11021 求余,这一步理解应该没什么问题。如果该分序列为 0,无需计算。
<3>对其余的二进制序列求余与上面两步相同。
3、按字节计算 CRC
有了上面按位计算的知识,理解这个就是小 case 了。还是举前面的例子:当字节计算 CRC 时,例如计 算二进制序列为 1001 1010 1010 1111 时,即 0x9a9f 时,将二进制序列数左移 16 位,即为 0x9a9f(0 0 0 0), 实际上该二进制序列可拆分为 0x9a00(0 0 0 0) + 0x009f(0 0 0 0),分析计算时和上面的步骤一样,唯一不同的 是计算中上一步的余数 CRC 要乘以 2 的八次方参与下一步的运算,这个应该好理解撒。为了简化编程,将 计算中的 CRC 拆成高八位和低八位的形式,高八位的值直接与本位值相加求余,低八位的值乘以 2 的八次 方后作为余数和计算得的余数相加。为了提高计算速度,我们把 8 位二进制序列数的 CRC 全部计算出来, 放在一个表中,采用查表法可大大提高计算速度。
CRC校验码计算过程
CRC校验码计算过程1. 选择生成多项式(Generator Polynomial):CRC校验码的生成多项式是决定校验码位数和最终生成的校验码的关键。
常用的CRC生成多项式有CRC-8、CRC-16和CRC-32等。
选择适当的生成多项式是校验码计算过程的第一步。
2.添加补位:在待传输的数据帧最后添加足够位数的补位,以使得数据帧的长度等于生成多项式的位数。
例如,如果生成多项式是8位,则在待传输的数据帧最后添加8位的补位。
3.初始化寄存器:用一个特定的初始值(通常为全1或全0)初始化一个寄存器,该寄存器的长度等于生成多项式的位数。
这个寄存器可以看作是一个多项式的系数。
4.逐位相除:将待传输的数据帧与生成多项式进行逐位相除。
具体步骤如下:a.将数据帧的最高位与寄存器的最高位进行异或运算,并将结果送到寄存器的低位。
b.将寄存器的最高位右移一位。
c.如果寄存器最低位原来是1,从生成多项式中读取相应位,并与寄存器的当前位进行异或运算。
d.重复步骤b和c,直到数据帧的最后一位。
5.得到校验码:如果数据帧的每一位都被除完,剩下的寄存器中的位就是校验码。
6.添加校验码:将生成的校验码作为数据帧的最后几位,用于传输。
7.接收端校验:在接收端,接收到的数据帧包括校验码。
通过执行与发送端相同的CRC校验算法,可以得到一个校验码。
比较接收到的校验码与计算得到的校验码是否一样,不同则表示存在错误。
以上是CRC校验码的计算过程。
通过执行这个过程,可以实现数据的有效校验,提高数据传输的可靠性。
不过需要注意的是,CRC校验码只能检测错误,而不能纠正错误。
如果发现校验码不匹配,就需要进行错误处理,例如请求重新发送数据。
CRC码计算及校验原理计算
CRC码计算及校验原理计算
CRC(Cyclic Redundancy Check)码是一种常用的错误检测码,用于验证数据在传输过程中是否发生错误。
CRC码的计算和校验原理是通过生成多项式对数据进行计算和校验。
以下是CRC码计算及校验原理的详细解释。
一、CRC码的计算原理:
1.选择一个生成多项式G(x),比如G(x)=x^3+x^2+1
2.假设要发送的数据为D(x),将D(x)乘以x的次数等于生成多项式的次数再取模,得到一个除数。
3.将除数与G(x)进行异或运算,产生余数。
4.将余数拼接到原始数据D(x)的后面,得到新的数据N(x)。
5.将数据N(x)进行发送。
二、CRC码的校验原理:
1.接收到数据N(x)后,用生成多项式G(x)去除以接收的数据N(x)。
2.如果除数为0,则认为数据没有发生错误,否则则认为数据发生了错误。
举例说明:
1.计算步骤:
2.校验步骤:
-用生成多项式G(x)去除以接收的数据N(x),得到商和余数。
-如果余数为0,说明数据没有发生错误,否则说明数据发生了错误。
通过以上计算和校验步骤,可以判断数据在传输过程中是否发生错误。
CRC码的优点是简单、效率高,能够检测到大部分错误,被广泛应用
在通信、存储等领域。
然而,CRC码只能检测错误,不能纠正错误。
当数
据发生错误时,需要重新发送数据或通过其他方法进行纠错处理。
crc校验例子
crc校验例子CRC校验例子是一种常用的错误检测机制,用于验证传输过程中数据的完整性。
CRC(Cyclic Redundancy Check)校验通过计算数据的循环冗余校验码来检测数据是否在传输过程中发生了变化。
下面,我将给出一个CRC校验的简单例子来帮助理解其工作原理。
假设我们要传输一个8位的二进制数据10110011。
为了进行CRC校验,我们首先需要选择一个CRC多项式作为校验标准。
在这个例子中,我们选择了一个8位的CRC-8多项式,即x^8 + x^2 + x + 1,表示为0b100000111。
首先,将要发送的数据和一个8位的校验码寄存器初始化为0。
然后,将数据按位与校验码寄存器进行异或运算(XOR)。
如果数据位为1,则将校验码寄存器右移一位,并将CRC多项式0b100000111与校验码寄存器进行异或运算;如果数据位为0,则只将校验码寄存器右移一位,不进行异或运算。
这一过程重复8次,直到所有数据位都进行了处理。
计算完成后,校验码寄存器中的内容即为CRC校验码,用于验证数据的完整性。
在这个例子中,CRC校验码为0b01001000。
传输数据时,将原始数据和CRC校验码拼接在一起,发送给接收方。
接收方在接收到数据后,将数据和CRC校验码进行相同的CRC运算。
如果接收到的数据传输过程中没有发生错误,接收方计算得到的校验码与接收到的CRC校验码应该相同。
如果两者相同,表示数据传输完整;如果不同,则表示数据传输过程中发生了错误,需要重传数据。
CRC校验作为一种简单而有效的错误检测机制,在计算机网络、通信系统等领域得到了广泛的应用。
通过计算校验码,我们可以快速判断数据传输是否正确,提高传输的可靠性。
利用CRC进行检验的过程及结果
利用CRC进行检验的过程可简单描述如下:在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的r位监督码(CRC)码,附在原始信息的后边,构成一个新的二进制码序列(共k+r位),然后发送出去。
在接受端,根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。
这个规则在差错控制理论中称为“生成多项式”。
(1)CRC编码的代数学原理在代数编码理论中,将一个码组表示为一个多项式,码组中的各码元作为多项式的系数。
例如,1100101表示为1*x6 +1*x5 +0*x4+0*x3+1*x2+0*x+1 ,既x6+x5+x2+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)。
用公式可以表示为T(x)= x r P(x)+ R(x)接收方解码的方法是:将T(x)除以G(x),如果余数为0,则说明传输中无错误发生,否则说明传输有误。
举例来说,设信息码为1100,生成多项式为1011,既P(x)= x3+ x2 G(x)= x3+ x+1,则可以用以下方法计算CRC。
,x r P(x)/ G(x)= x3(x3+ x2 )/ x3+ x+1= (x6 + x5)/ x3+ x+1=(x3+ x2+ x)+ x/ x3+ x+1 既R(x)= x。
注意到G(x)最高幂次r=3,得出CRC为010。
如果用竖式除法,计算过程为:11101011/ 11000001011111010111010101100100000010因此,T(x)= x6 + x5+ x,即1100000+010=1100010。
如果传输无误,T(x)/ G(x)= (x6 + x5+ x)/ x3+ x+1= x3+ x2+ x无余式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算法简单实现crc校验
计算法简单实现crc校验
前一段时间做协议转换器的时间用到CRC-16校验,查了不少资料发现都不理想。
查表法要建表太麻烦,而计算法觉得那些例子太罗嗦。
最后只好自己写了,最后发现原来挺简单嘛:)两个子程序搞定。
这里用的多项式为:CRC-16=X16+X12+X5+X0=2 +2 +2+2 =0x11021 因最高位一定为“1”,故略去计算只采用0x1021即可 CRC_Byte:计算单字节的CRC值 CRC_Data:计算一帧数据的CRC值 CRC_HighCRC_Low:存放单字节CRC值 CRC16_HighCRC16_Low:存放帧数据CRC值; ------------------------------------------------------------- ;Functi on:CRConebyte ;Input:CRCByte ;Output:CRC_HighCRC_Low ; -------------------------------------------------------------
CRC_Byte: clrfCRC_Low clrfCRC_High movlw09H movwfv_Loop1 movfCRCByte,w movwfCRC_High CRC: decfszv_Loop1;8次循环,每一位相应计算 gotoCRC10 gotoCRCend CRC10 bcfSTATUS,C rlfCRC_Low rlfCRC_High btfssSTATUS,C  
;gotoCRC;为0不需计算movlw10H;若多项式改变,这里作相应变化xorwfCRC_High,f movlw21H;若多项式改变,这里作相应变化 xorwfCRC_Low,f gotoCRC CRCend: nop nop return ; ------------------------------------------------------------- ;CRCone byteend ; ------------------------------------------------------------- ; ------------------------------------------------------------- ;Functi on:CRCdate ;Input:BufStart(A,B,C)(一帧数据的起始地址)v_Count(要做CRC的字节数);Output:CRC16_HighCRC16_Low(结果); -------------------------------------------------------------
CRC_Data: clrfCRC16_High clrfCRC16_Low CRC_Data10 movfINDF,w
xorwfCRC16_High,w movwf&nb
sp;CRCByte callCRC_Byte incfFSR decfv_Count;需计算的字节数movfCRC_High,w xorwfCRC16_Low,w movwfCRC16_High movfCRC_Low,w movwfCRC16_Low movfv_Count,w;计算结束? btfssSTATUS,Z gotoCRC_Data10 return ; ------------------------------------------------------------- ;CRCdat eend ; ------------------------------------------------------------- 说明:CRC的计算原理如下(一个字节的简单例子) 110110000000000000000000 -一个字节数据,左移16b d01000000100001 -CRC-CCITT多项式,17b -------------------------- 10100000001000010 -中间余数 d01000000100001 ------------------------- 10100000110001100 d
01000000100001 ----------------------- 10100011010110100 d01000000100001 --------------------- 10101101001010100 d0ppppppppppppppppp -------------------------- ... aaaaaaaaaaaaaaaa -结果A(A1,A0) 由此与一字节的情况比较,将两个字节分开计算如下:先算高字节: dddddddd000000000000000000000000 -D1,0,0,0 pppppppppppppppp -P ----------------------------------- ... aaaaaaaaaaaaaaaa -高字节部分余数PHA三个8位的列中只低两个字节的最后结果是余数,而数据所在的高&nbs
p;8位列最后都被消去了,因其中的运算均为异或,不产生进位或借位,故每一位数据只影响本列的结果,即d并不直接影响结果。
再将前例变化一下重列如下:11011000 -------------------------- 10001000000100001//P d01000000100001//P 0000000000000//0 d01000000100001//P 0000000000000//0 d01000000100001//P 0000000000000//0 d01000000100001//P ------------------- 0100101001110101 现在的问题就是如何根据d来对P移位异或了,从上面的例子看,也可以理解为每步移位,但
根据d决定中间余数是否与P异或。
从前面原来的例子可以看出,决定的条件是中间余数的最高位为0,因为P的最高位一定为1,即当中间余数与d相应位异或的最高位为1时,中间余数移位就要和P异或,否则只需移位即可。
其方法如下例(上例的变形,注意其中空格的移动表现了d的影响如何被排除在结果之外): d--------a-------- 10000000000000000 -HSB=1 0000000000000000 -a =1 0001000000100001 -不含最高位的 1 ----------------- 10001000000100001 0010000001000010 0001000000100001 ----------------- 00011000001100011 -HSB=0 0110000011000110 ----------------- 10110000011000110 -HSB=1 1100000110001100 0001000000100001 ----------------- 11101000110101101 -HSB=0 1010001101011010 ----------------- 01010001101011010 -HSB=1 &nb
sp;0100011010110100 0001000000100001 ----------------- 00101011010010101 -HSB=0 1010110100101010 ----------------- 01010110100101010 -HSB=1 0101101001010100 0001000000100001 ----------------- 0100101001110101 -CRC 结合这些,前面的程序就好理解了。