16位CRC校验原理与算法分析
16位循环冗余校验码_CRC_的原理和性能分析

16位循环冗余校验码_CRC_的原理和性能分析16位循环冗余校验码(CRC)是一种广泛应用于数据传输中的错误检测码。
它通过使用除法运算和异或运算来生成一个冗余校验码,并将其附加到数据上。
接收方在接收到数据后,通过同样的计算方式对数据进行校验,然后与接收到的校验码进行比较,从而判断数据是否存在错误。
CRC的原理如下:1.选择一个特定的多项式作为生成器多项式G(x),通常以二进制方式表示。
2.将数据D(x)乘以x的n次方,其中n为生成器多项式的次数。
3.将上述结果除以生成器多项式G(x),并将余数作为冗余校验码。
具体的计算过程如下:1.将生成器多项式转换为二进制数,作为一个校验位模型。
2.将数据与n个0相接,使其长度与生成器多项式的次数一致。
3.将上述结果除以生成器多项式,并将余数作为冗余校验码。
性能分析:1.理论上,CRC能够探测所有偶数个错误位和绝大多数奇数个错误位。
但由于CRC运算时使用的是模2除法,因此会漏掉部分奇数个错误位。
2.CRC的检错性能与生成器多项式的选择相关。
选择一个好的生成器多项式很重要,能够提高CRC的检错能力。
3.16位的CRC校验码相对于32位或更多位的CRC校验码来说,冲突概率较高。
这意味着可能存在不同的数据产生相同的校验码。
因此,在应用中,需要根据实际情况选择合适的CRC位数。
总结:16位循环冗余校验码通过除法运算和异或运算生成一个冗余校验码,用于检测数据传输中的错误。
它的性能取决于生成器多项式的选择,能够探测大部分的错误位。
然而,由于CRC采用模2除法,可能会漏掉部分奇数个错误位。
在应用中,需要根据实际情况选择合适的CRC位数。
最详细易懂的CRC-16校验原理(附源程序)

最详细易懂的CRC-16校验原理(附源程序)1、循环校验码(CRC码):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。
2、生成CRC码的基本原理:任意一个由二进制位串组成的代码都可以和一个系数仅为‘和’取值的多项式一一对应。
例如:代码对应的多项式为X6+X4+X2+X+1,而多项式为X5+X3+X2+X+1对应的代码101111 o标准CRC生成多项式如下表:名称生成多项式简记式*标准引用CRC-4 x4+x+1 3 ITU G.704CRC-8 x8+x5+x4+1 0x31CRC-8 x8+x2+x1+1 0x07CRC-8x8+x6+x4+x3+x2+x10x5ECRC-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 SCTP3、CRC-16校验码的使用:现选择最常用的CRC-16校验,说明它的使用方法。
根据Modbus协议,常规485通讯的信息发送形式如下:地址功能码数据信息校验码1byte 1byte nbyte 2byteCRC校验是前面几段数据内容的校验值,为一个16位数据,发送时,低8位在前,高8为最后。
例如:信息字段代码为:1011001,校验字段为:1010。
发送方:发出的传输字段为:1 0 1 1 0 0 1 1 0 10信息字段校验字段接收方:使用相同的计算方法计算出信息字段的校验码,对比接收到的实际校验码,如果相等及信息正确,不相等则信息错误;或者将接受到的所有信息除多项式,如果能够除尽,贝y 信息正确。
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。
在实际应用中,发送方将数据和校验码一起发送给接收方,接收方在接收到数据后进行校验,如果计算得到的校验码与接收到的校验码一致,说明数据传输没有错误;如果不一致,则说明数据传输存在错误。
CRC16计算方法

CRC16计算方法
CRC16(Cyclic Redundancy Check)是一种常用的错误检测方法,用
于检测数据在传输或存储过程中是否发生了错误。
CRC16使用16位的多
项式来计算冗余校验值,并将其附加到原始数据的末尾。
接收方可以使用
相同的多项式来对接收到的数据进行计算,然后将得到的校验值与传输过
程中接收到的校验值进行比较,以判断数据是否在传输过程中发生了错误。
3.在数据的末尾添加16位的0。
这16位的0用于计算CRC16的初始值。
对于前面的例子,需要在数据的末尾添加16位的0,即32个0。
4.将生成多项式与数据进行异或操作。
将生成多项式左移一位,然后
与数据进行异或操作。
如果生成多项式的最高位与数据的最高位相同,则
将生成多项式左移一位后的最低位置为1,否则置为0。
重复这个过程直
到所有的数据都经过了异或操作。
5.将得到的结果作为新的数据,并重复第4步的操作,直到整个数据
都被处理完。
6.最后得到的结果即为CRC16的值。
这个值可以附加到原始数据的末尾,用于传输或存储。
需要注意的是,CRC16并不是用于纠错的方法,而是用于检测数据是
否在传输过程中发生了错误。
如果检测到数据错误,可以要求重新传输数据。
如果数据没有发生错误,那么接收方计算得到的CRC16值与传输过程
中附加的CRC16值应该是相同的。
crc16校验范围

crc16校验范围摘要:1.什么是CRC16 校验2.CRC16 校验的应用领域3.CRC16 校验的计算方法4.CRC16 校验的优点和局限性5.CRC16 校验在实际应用中的例子正文:CRC16 校验是一种循环冗余校验技术,主要用于数据传输或存储中的错误检测。
其原理是在数据后面附加一些校验位,接收方在接收到数据后,通过相同的计算方法,对数据进行校验,如果计算出的校验位与接收到的校验位不一致,说明数据在传输过程中出现错误。
CRC16 校验广泛应用于各种通信领域,如以太网、串口通信、CAN 总线等。
它可以检测出数据传输中的单比特错误,也可以检测出多比特错误。
因此,CRC16 校验能够有效地提高数据传输的可靠性。
CRC16 校验的计算方法是利用生成多项式来计算。
生成多项式是由一个二进制多项式表示,多项式的阶数决定了CRC 校验的位数。
例如,对于CRC16 校验,阶数通常为16。
在计算过程中,首先将数据用二进制表示,并在其后面添加16 个0,形成一个新的二进制数。
然后,将这个数与生成多项式进行异或操作,直到生成多项式的次数小于等于16。
最后,将得到的结果取反,即可得到CRC16 校验位。
CRC16 校验具有较高的检错能力和较低的误报率。
但是,它也有一些局限性,比如不能检测出所有的错误,尤其是当错误位数较多时,可能会出现漏检的情况。
因此,在实际应用中,需要根据具体情况选择合适的校验方法。
例如,在以太网通信中,CRC16 校验被广泛应用于帧校验序列的计算。
当数据帧在网络中传输时,接收方会对接收到的数据进行CRC16 校验,如果计算出的校验位与接收到的校验位不一致,说明数据在传输过程中出现错误,接收方会立即丢弃该数据帧。
crc 16 函数

crc 16 函数摘要:1.什么是CRC 16 函数2.CRC 16 函数的原理3.CRC 16 函数在通信中的应用4.如何实现CRC 16 函数5.CRC 16 函数的优缺点正文:CRC 16 函数是一种循环冗余校验算法,主要用于数据传输过程中的错误检测。
它通过在数据帧的末尾添加一些校验位,接收方可以根据这些校验位来判断数据是否在传输过程中发生错误。
CRC 16 函数的主要特点是计算过程简单、检测准确性高,因此被广泛应用于通信领域。
CRC 16 函数的原理是:在发送端,首先将要发送的数据用二进制表示,并在其后面添加一些0,使得数据的位数变为16 的倍数。
然后,在数据前面添加一个16 位的初始值。
接着,将数据和初始值一起进行二进制多项式除法运算。
最后,将得到的余数作为校验位添加到数据帧的末尾。
在通信中,发送方将数据帧和校验位一起发送给接收方。
接收方收到数据后,也会进行CRC 16 函数计算。
如果计算结果与接收到的校验位相同,说明数据传输正确;如果不同,说明数据在传输过程中发生了错误。
实现CRC 16 函数的方法有很多,常见的有硬件实现和软件实现。
硬件实现是通过专门的硬件电路来完成CRC 16 计算,其优点是速度快、可靠性高,但成本较高。
软件实现是通过编程实现CRC 16 计算,其优点是成本低、易于实现,但计算速度较慢。
总的来说,CRC 16 函数是一种简单、高效的数据校验方法。
它可以在数据传输过程中及时发现错误,从而保证通信的可靠性。
然而,CRC 16 函数也存在一定的局限性,例如检测错误的能力受到多项式长度的限制,以及无法检测出所有类型的错误等。
CRC16校验码如何计算

CRC16校验码如何计算CRC16(Cyclic Redundancy Check)是一种校验码算法,用于检测数据传输过程中是否发生错误或数据完整性是否受到损害。
它通过将数据进行多项式除法,计算出一个固定长度的校验值,将其附加到数据中进行传输。
接收端在接收数据后同样通过计算CRC16校验值,对比发送端的校验值,来判断数据是否正确接收。
下面是计算CRC16校验码的具体步骤:1.选择校验多项式,CRC16有多种不同的多项式,如:0x8005,0x1021等。
每种多项式的校验码长度都是16位。
2.将数据按照ASCII或者二进制形式转换为比特流。
3.将初始化值(Initial Value)设置为0x0000。
4.以比特流的形式依次读取数据。
5.将读取到的比特添加到校验寄存器中。
6.将校验寄存器中最高位的比特进行异或运算,并左移出。
7.循环第6步,直到所有比特处理完毕。
8.将校验寄存器中的16位值作为CRC16校验码。
9.发送端在数据传输完成后,将CRC16校验码附加在数据中,并一同发送给接收端。
10.接收端在接收数据后,使用与发送端相同的校验多项式及方法,对接收到的数据进行CRC16校验码的计算。
11.计算出的校验码与接收到的校验码进行比对。
12.如果两个校验码相等,则数据传输正确;如果两个校验码不相等,则数据传输错误。
需要注意的是,CRC16校验码只能检测出部分错误,对于所有错误都能检测出的校验码算法并不存在。
因此,在实际应用中,CRC16通常与其他错误检测和纠正方法(如奇偶校验、海明码等)一起使用,以提高传输数据的可靠性。
以上就是CRC16校验码的计算方法。
虽然CRC16校验码的计算过程较为复杂,但由于其计算速度快、冲突率低等特点,被广泛应用于数据通信、数据存储等领域,保障了数据可靠性和一致性。
CRC16算法原理

CRC算法及C实现学习体会2008-09-20 15:21:13 阅读161 评论0 字号:大中小订阅一、CRC算法原理CRC校验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去。
在接收端,则根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。
16位的CRC码产生的规则是先将要发送的二进制序列数左移16位(既乘以)后,再除以一个多项式,最后所得到的余数既是CRC码。
假设数据传输过程中需要发送15位的二进制信息 g=101001110100001,这串二进制码可表示为代数多项式g(x) = x^14 + x^12 + x^9 + x^8 + x^7 + x^5 + 1,其中g中第k位的值,对应g(x)中x^k的系数。
将g(x)乘以x^m,既将g后加m个0,然后除以m阶多项式h(x),得到的(m-1)阶余项 r(x)对应的二进制码r就是CRC编码。
h(x)可以自由选择或者使用国际通行标准,一般按照h(x)的阶数m,将CRC算法称为CRC-m,比如CRC-32、CRC-64等。
国际通行标准可以参看/wiki/Cyclic_redundancy_checkg(x)和h(x)的除运算,可以通过g和h做xor(异或)运算。
比如将11001与10101做xor运算:明白了xor运算法则后,举一个例子使用CRC-8算法求101001110100001的效验码。
CRC-8标准的h(x) = x^8 + x^7 + x^6 + x^4 + x^2 + 1,既h是9位的二进制串111010101。
经过迭代运算后,最终得到的r是10001100,这就是CRC效验码。
通过示例,可以发现一些规律,依据这些规律调整算法:1. 每次迭代,根据gk的首位决定b,b是与gk进行运算的二进制码。
crc16校验码计算

crc16校验码计算
CRC (Cyclic Redundancy Check) 是一种用于检测数据传输或存储错误的常见校验方法。
以下是CRC16 校验码的计算过程。
1. 计算数据段的每一位
首先,将需要计算校验码的数据段进行二进制表示。
对于CRC16,数据段可以是任意长度的字节序列。
2. 初始化两个寄存器为0xFFFF
在CRC16 计算过程中,需要使用两个16 位寄存器(通常命名为`reg` 和`temp`),它们在开始时被初始化为十六进制值`FFFF`。
3. 对每一个字节计算其CRC码,并存储到寄存器中
遍历数据段的每一个字节。
对于数据段中的每个字节,执行以下步骤:
对该字节与`reg` 的低8 位进行异或操作。
将结果存储回`reg` 的低8 位,并将`reg` 的高8 位左移一位。
如果最高位为1,则再次与多项式`0x1021` 进行异或操作(或等效的十六进制值)。
`0x1021` 是CRC-16 标准的多项式。
4. 反转寄存器中的CRC码
最后,将`reg` 的值反转(或取反)。
这是为了确保生成的CRC 校验码符合标准格式。
在大多数情况下,校验码使用低位在前(LSB)的格式。
5. 完成计算
完成上述步骤后,`reg` 中的值即为CRC16 校验码。
这个值可以附加到数据段的后面,以便接收方进行验证。
注意:在实际应用中,CRC16 校验码的计算通常由硬件或专门的CRC 计算库完成,而不是手动执行每一步。
上述步骤提供了一个基本的理解,但实际实现可能涉及更复杂的优化和调整。
16位CRC校验原理与算法分析

16位CRC校验原理与算法分析CRC(Cyclic Redundancy Check)是数据通信中常用的一种校验算法。
校验的目的是为了检测数据在传输过程中是否发生了错误或损坏。
CRC校验通过添加冗余数据(校验码)来实现错误检测。
一、CRC校验原理CRC校验通过生成一个多项式,将要传输的数据与该多项式进行除法运算,得到的余数作为校验码。
接收方收到数据后,也进行相同的除法运算,将得到的余数与发送方传来的校验码进行比较。
如果两者一致,说明数据在传输过程中没有发生错误;如果不一致,则说明数据发生了错误。
CRC校验原理可以通过以下步骤进行描述:1.选择一个固定的生成多项式。
常见的生成多项式有CRC-16、CRC-32等。
2.将要传输的数据(称为信息位)通过左移添加n个0来扩展为n+m 位,其中n为生成多项式的位数减1,m为校验码的位数。
这样做的目的是为了确保信息位和校验码可以做除法运算。
3.用生成多项式对扩展后的数据进行除法运算,得到的余数即为校验码。
4.将校验码附加到原始数据后面,形成完整的发送数据。
接收方收到数据后,也进行相同的除法运算,得到的余数与发送方传来的校验码进行比较。
如果两者一致,说明数据在传输过程中没有发生错误;如果不一致,则说明数据发生了错误。
二、CRC校验算法分析CRC校验算法的关键在于选择合适的生成多项式。
生成多项式的位数确定了校验码的位数,也决定了CRC校验的可靠性。
常见的生成多项式有CRC-16和CRC-32CRC-16:CRC-32:CRC校验算法实现时,通常使用查表法来加快计算速度。
预先计算所有2^8个字节的CRC余数后,将其存储在一个256个元素的表中。
每次对一个字节进行CRC运算时,只需要在表中查找对应的余数即可。
三、CRC校验应用CRC校验算法广泛应用于数据通信中,主要有以下几个方面:1.数据传输:在数据传输中,发送方将数据附加上CRC校验码,接收方收到数据后可以通过CRC校验码检查数据的完整性,防止传输错误。
16位循环冗余校验码_CRC_的原理和性能分析

2005 年第 5 期 9 月 5 日出版
●应用技术
16 位循环冗余校验码 (CRC) 的 原理和性能分析
张平安
(山西省专用通信局)
摘 要 : CRC 是一种数据通信中广泛应用的检错方法 ,文章从编码的数学原理出发 ,分析了
CRC 的编码本质 、生成/ 校验矩阵 、最小码重等参数 ,推导了编码应用中的检错概率 、
简单描述 最高次数 r = 16 ,周期 32767
长度为 k ,k 小于 32767 长度为 n ,n - k + r 长度为 n ,n = k + r
长度为 n ,r (x) = s(x) + e (x)
余多项式
q (x)
最高次数小于 r
CRC 编码分析在 GF(2) 上进行 ,分析的工具是近世代数的多项
显然
s ( x) = m ( x) xr + q( x) = p( x) g ( x)
s ( x) mod g ( x) = 0 ,即发送编码多项式可以被生成多项式 整除 。如果传输中没有错误则 r ( x) = s ( x) ,应有 r ( x) mod g ( x) = 0。
很明显如果信息传输的过程中没有发生错误 ,则接收到的 信息多项式一定可以被生成多项式整除 ,这就是 CRC 的检错 原理 。
式理论 。基本过程如下 : 设 m ( x) xr = p ( x) g ( x) + q ( x) , p ( x) 为商式 , q ( x) 为余式两边同时加余式 q ( x) m ( x) xr + q( x) = p( x) g ( x) + q( x) + q( x)
16位CRC校验原理与算法分析

16位CRC校验原理与算法分析2007-12-14 09:37这里,不讨论CRC的纠错原理以及为什么要选下面提及的生成多项式,只是针对以下的生成多项式,如何获得CRC校验码,作一个比较详细的说明。
标准CRC生成多项式如下表:名称生成多项式简记式* 标准引用CRC-4 x4+x+1 3ITU 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]。
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的,所以商是没有意义的,我们不要。
CRC16算法分析(资料)

CRC16算法分析一、概述数据校验:通俗的说,就是为保证数据的完整性,用一种指定的算法对原始数据计算出的一个校验值。
接收方用同样的算法计算一次校验值,如果和随数据提供的校验值一样,就说明数据是完整的。
关于比较流行的数据校验算法有很多,如奇偶校验、BCC异或校验法、CRC循环冗余校验、MD5校验等,各个算法的适用范围不同,前两种适用于要求不太高的数据通信,CRC则可用于硬盘数据和网络传输,而MD5则适用于数据比较大或要求比较高的场合。
奇偶校验(Parity Check):在数据存储和传输中,字节中额外增加一个比特位,用来检验错误,其中校验位可以通过数据位异或计算出来。
普通的RS232串口通讯就可另加一位用于放奇偶校验值。
BCC异或校验法(Block Check Character):把所有数据都和一个指定的初始值(通常是0)异或一次,最后的结果就是校验值,通常把它附在通讯数据的最后一起发送出去。
接收方收到数据后自己也计算一次异或和校验值,如果和收到的校验值一致就说明收到的数据是完整的。
此法适用于大多数要求不高的数据通讯,在IC卡接口通讯、很多单片机系统的串口通讯都使用。
CRC循环冗余校验(Cyclic Redundancy Check):利用除法及余数的原理来进行错误检测的,将接收到的码组进行除法运算,如果除尽,则说明传输无误;如果未除尽,则表明传输出现差错。
CRC校验具还有自动纠错能力。
CRC-12码通常用来传送6-bit字符串;CRC-16及CRC-CCITT码则用是来传送8-bit字符;CRC-32码用于硬盘数据,网络传输等。
CRC校验在WinRAR、以太网卡芯片、MPEG解码芯片中有着广泛的应用。
MD5校验(Message Digest Algorithm 5):对输入消息按512-bit分组,要填充成为512位的整数倍,且最后一组的后64位用来填充消息长度,然后算法产生128位散列值就是校验码。
crc 16 函数

crc 16 函数【原创实用版】目录1.CRC(循环冗余校验)简介2.CRC-16 的计算方法3.CRC-16 的应用领域4.CRC-16 的优点与局限性正文1.CRC(循环冗余校验)简介循环冗余校验(CRC,Cyclic Redundancy Check)是一种数据传输过程中检测和纠正错误的技术。
通过在数据传输中增加一些校验位,然后接收方在接收到数据后,通过相同的计算方法,对数据进行校验,从而判断数据是否发生改变或损坏。
CRC 技术广泛应用于数据通信、存储设备和计算机网络等领域。
2.CRC-16 的计算方法CRC-16 是一种常用的 CRC 校验方法,其计算过程如下:(1)首先确定要添加的校验位数,通常为 4 位。
(2)在数据位后面添加 4 个 0,形成一个新的数据。
(3)使用两个寄存器,一个存放数据,一个存放校验位。
将数据和校验位分别存入两个寄存器中。
(4)使用一个生成多项式(通常为 16 位),不断地用该生成多项式去除数据和校验位之和,直到校验位全部移出寄存器。
每进行一次操作,将生成多项式和余数存入另一个寄存器。
(5)将所有校验位按照从低到高的顺序排列,形成一个 4 位的校验码。
3.CRC-16 的应用领域CRC-16 广泛应用于各种数据通信和存储系统中,例如:(1)网络数据传输:在网络数据传输过程中,为了保证数据的完整性和正确性,常常使用 CRC-16 对数据进行校验。
(2)存储设备:许多存储设备,如硬盘、闪存等,使用 CRC-16 对数据进行校验,以便检测和纠正数据错误。
(3)无线通信:在无线通信领域,CRC-16 也被广泛应用于数据传输的校验。
4.CRC-16 的优点与局限性CRC-16 具有以下优点:(1)计算简单:CRC-16 的计算方法相对简单,易于实现。
(2)检测能力强:CRC-16 可以检测出大部分数据传输过程中的错误。
然而,CRC-16 也存在以下局限性:(1)不能检测出所有的错误:CRC-16 不能检测出所有的数据错误,特别是当错误位数达到 32 位时,CRC-16 将无法检测出错误。
CRC16计算方法

CRC16计算方法CRC16是一种循环冗余校验码,用于数据传输的错误检测。
它通过生成一个16位的校验码,对传输的数据进行校验,以判断是否发生了传输错误。
CRC16计算方法是一种快速而可靠的校验方法,被广泛应用于各种通信协议和数据传输系统中。
生成多项式的选择:生成多项式是用来进行CRC计算的重要参数,不同的生成多项式会影响CRC的性能。
常用的生成多项式有多种,如CRC-16-CCITT、CRC-16-XMODEM等,它们的选择基于不同的应用需求和性能要求。
计算过程:1.初始化:首先,需要选择一个初始值,通常为0xFFFF或0x0000。
这个初始值在计算过程中会不断更新。
2.循环运算:循环运算是CRC16计算的关键步骤,它会对每个数据字节进行计算。
首先,将初始值与第一个数据字节进行异或运算。
然后,对每个数据字节进行8次循环运算。
循环运算的每一次都涉及到两个操作:左移和异或。
左移:将CRC寄存器的值左移1位。
异或:将CRC寄存器的最高位与下一个数据字节进行异或运算。
循环运算结束后,CRC寄存器中的值即为CRC16校验码。
3.结果反转:结果反转是为了将CRC16校验码按照数据传输的字节顺序进行反转。
反转后的校验码可以更好地与接收到的数据进行比对。
以上就是CRC16的计算方法。
当数据传输完成后,发送方会将数据和计算得到的CRC16校验码一起发送给接收方。
接收方通过对接收到的数据进行计算,得到一个接收方CRC16校验码。
接收方将发送方CRC16校验码与接收方CRC16校验码进行比对,如果两者相等,则数据传输没有发生错误。
如果两者不相等,则说明数据传输发生了错误,需要进行重传或其他差错处理。
crc16校验原理

不难看出,余式有 256 种可能的值,实际上就是 0~255 以 X16+X12+X5+1 为权得到的 CRC 码,可以通过函数 crc16l 来计算。以 1 为例。
code test[]={0x01}; crc = 0; ptr = test; crc = crc16l(ptr,1);
执行结果 crc = 1021,这就是 1 对应的余式。
图中进行 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)
图 1,图 2 说明了 CRC 校验中 CRC 值是如何计算出来的,体现的多项式正 是 X16+X12+X5+1。 Serial Data 即是需要校验的数据。从把数据移位开始计 算,将数据位(从最低的数据位开始)逐位移入反向耦合移位寄存器(这个名词 我也不懂,觉得蛮酷的,就这样写了,嘿)。当所有数据位都这样操作后,计算 结束。此时,16 位移位寄存器中的内容就是 CRC 码。
很多资料上都写了查表法来计算,当时是怎么也没想通。其实蛮简单的。假设通 过移位处理了 8 个 bit 的数据,相当于把之前的 CRC 码的高字节(8bit)全部移 出,与一个 byte 的数据做 XOR 运算,根据运算结果来选择一个值(称为余式), 与原来的 CRC 码再做一次 XOR 运算,就可以得到新的 CRC 码。
CRC循环冗余错误校验计算方法

CRC循环冗余错误校验计算⽅法
说明:CRC循环冗余错误校验计算⽅法
CRC—16(循环冗余错误校验)⽣成CRC—16校验字节的步骤如下:
(1)装⼊⼀个16位寄存器,所有数位均为1。
(2)该16位寄存器的⾼位字节与开始8位字节进⾏“异或”运算。
运算结果放⼊这个16位寄存器。
(3)把这个16位寄存器向右移1位。
(4a)若向右(标记位)移出的数位是1,则⽣成多项式1010000000000001和这个寄存器进⾏“异或”运算。
(4b)若向右移出的数位是0,则返回(3)。
(5)重复(3)和(4),直⾄移出8位。
(6)另外8位与该16位寄存器进⾏“异或”运算。
(7)重复(3)—(6),直⾄该报⽂所有字节均与16位寄存器进⾏“异或”运算,并移位8次。
(8)这个16位寄存器的内容即2字节CRC错误校验。
crc16校验原理

校验原理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)=g 0+g1x+ g2x2+...+g(R-1)x(R-1)+g R x 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 的数学原理开始,一长串的表达式看的我头晕。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
unsigned short cRc_16=0;
unsigned short i,j,k;
for(i=0,k=0;i<256;i++,k++)
{
cRc_16 = i<<8;
for(j=8;j>0;j--)
{
if(cRc_16&0x8000)
//反转时 cRc_16&0x0001
cRc_16=(cRc_16<<=1)^gEnpoly;
0x31
CRC-8 x8+x2+x1+1
0x07
CRC-8 x8+x6+x4+x3+x2+x1 0x5E
CRC-12 x12+x11+x3+x+1
80F
CRC-16 x16+x15+x2+1
8005 IBM SDLC
CRC16-CCITT x16+x12+x5+1
1021 ISO HDLC, ITU X.25,
V.34/V.41/V.42, PPP-FCS
CRC-32 x32+x26+x23+...+x2+x+1 04C11DB7 ZIP, RAR, IEEE 802
LAN/FDDI, IEEE 1394, PPP-FCS
CRC-32c x32+x28+x27+...+x8+x6+1 1EDC6F41 SCTP
4)寄存器中的值则为 CRC 校验码 CRC[1]、CRC[0]。
III、计算机算法 2(字节型算法):256^n 表示 256 的 n 次方
把按字节排列的数据流表示成数学多项式,设数据流为 BYTE[n]BYTE[n-
1]BYTE[n - 2] 、 、 、 BYTE[1]BYTE[0] , 表 示 成 数 学 表 达 式 为
{YHL[n]×256/G17+(YH8[n]+BYTE[n-1])×256^2/G17},即上一字节 CRC 校
验码 Y[n]的高 8 位(YH8[n])与本字节 BYTE[n-1]异或,
该结果单独计算 CRC 校验码(即单字节的 16 位 CRC 校验码,对单字节可建立
表格,预先生成对应的 16 位 CRC 校验码),所得的 CRC 校验码与上一字节
生成多项式的最高位固定的 1,故在简记式中忽略最高位 1 了,如 0x1021 实 际是 0x11021。 I、基本算法(人工笔算):
以 CRC16-CCITT 为例进行说明,CRC 校验码为 16 位,生成多项式 17 位。 假如数据流为 4 字节:BYTE[3]、BYTE[2]、BYTE[1]、BYTE[0];
字节型算法如下: 1)CRC 寄存器组初始化为全"0"(0x0000)。(注意:CRC 寄存器组初始化全为 1 时,最后 CRC 应取反。) 2)CRC 寄存器组向左移 8 位,并保存到 CRC 寄存器组。 3)原 CRC 寄存器组高 8 位(右移 8 位)与数据字节进行异或运算,得出一个 指向值表的索引。 4)索引所指的表值与 CRC 寄存器组做异或运算。 5)数据指针加 1,如果数据没有全部处理完,则重复步骤 2)。 6)得出 CRC。 unsigned short GetCrc_16(unsigned char * pData, int nLength) //函数功能:计算数据流* pData 的 16 位 CRC 校验码,数据流长度为 nLength { unsigned short cRc_16 = 0x0000; // 初始化
BYTE[n]×256^n+BYTE[n-1]×256^(n-1)
+...+BYTE[1]*256+BYTE[0],在这里+表示为异或运算。设生成多项式为 G17
(17bit),CRC 码为 CRC16。
则
,
CRC16
=
(BYTE[n]×256^n+BYTE[n-1]×256^(n-1)+...+BYTE[1]×256+BYTE[0])×256^2
=
Z[n]×256^n+{YHL[n]×256/G17+(YH8[n]+BYTE[n-1])×256^2/G17}×256^(
n-1)+...+BYTE[1]×256×256^2/G17+BYTE[0]×256^2/G17
这 样 就 推 导 出 , BYTE[n-1] 字 节 的 CRC 校 验 码 为
E[1]×256×256^2/G17+BYTE[0]×256^2/G17
=
Z[n]×256^n+{(YH8[n]×256+YHL[n])×256/G17+BYTE[n-1]×256^2/G17}×
256^(n-1)+...+BYTE[1]×256×256^2/G17+BYTE[0]×256^2/G17
=
(Z[n]+Y[n]/G17)×256^n+BYTE[n-1]×256^(n-1)×256^2/G17+...+BYTE[1]
×256×256^2/G17+BYTE[0]×256^2/G17
=
Z[n]×256^n+{Y[n]×256/G17+BYTE[n-1]×256^2/G17}×256^(n-1)+...+BYT
// 反 转 时
cRc_16=(cRc_16>>=1)^gEnpoly
else
cRc_16<<=1;
//反转时 cRc_16>>=1
//表示的是 cRc_16 = cRc_16<<1;
}
cRctable_16[k] = cRc_16;
}
}
CRC 校验码 Y[n]的低 8 位(YL8[n])
乘以 256(即左移 8 位)异或。然后依次逐个字节求出 CRC,直到 BYTE[0]。
字节型算法的一般描述为:本字节的 CRC 码,等于上一字节 CRC 码的低 8 位左移 8 位,与上一字节 CRC 右移 8 位同本字节异或后所得的 CRC 码异或。
16 位 CRC 校验原理与算法分析
这里,不讨论 CRC 的纠错原理以及为什么要选下面提及的生成多项式,只是针
对以下的生成多项式,如何获得 CRC 校验码,作一个比较详细的说明。
标准 CRC 生成多项式如下表:
名称 生成多项式
简记式* 标准引用
CRC-4 x4+x+1
3
ITU G.704
CRC-8 x8+x5+x4+1
数据流左移 16 位,相当于扩大 256×256 倍,再除以生成多项式 0x11021,做
不借位的除法运算(相当于按位异或),所得的余数就是 CRC 校验码。
发送时的数据流为 6 字节:BYTE[3]、BYTE[2]、BYTE[1]、BYTE[0]、CRC[1]、
CRC[0];
II、计算机算法 1(比特型算法):
/G17,即数据流左移 16 位,再除以生成多项式 G17。
先变换 BYTE[n-1]、BYTE[n-1]扩大后的形式,
CRC16
=
BYTE[n]×256^n×256^2/G17+BYTE[n-1]×256^(n-1)×256^2/G17+...+BYT
E[1]×256×256^2/G17+BYTE[0]×256^2/G17
}
void mK_cRctable(unsigned short gEnpoly)
//函数功能:生成 0-255 对应的 16CRC 校验码,其实就是计算机算法 1(比
特型算法)
//gEnpoly 为生成多项式
//注意,低位先传送时,生成多项式应反转(低位与高位互换)。如 CRC16-CCITT
为 0x1021,反转后为 0x8408
1)将扩大后的数据流(6 字节)高 16 位(BYTE[3]、BYTE[2])放入一个长度为
16 的寄存器;
2)如果寄存器的首位为 1,将寄存器左移 1 位(;
否则仅将寄存器左移 1 位(寄存器的最低位从下一个字节获得);
3)重复第 2 步,直到数据流(6 字节)全部移入寄存器;
while(nLength>0) {
cRc_16 = (cRc_16 << 8) ^ cRctable_16[((cRc_16>>8) ^ *pData) & 0xff]; //cRctable_16 表由函数 mK_cRctable 生成
nLength--; pData++;
}
return cRc_16;