16位CRC校验原理与算法分析

合集下载

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校验原理(附源程序)

最详细易懂的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校验码的计算方法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计算方法
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校验范围

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 函数

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校验码如何计算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算法原理

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进行运算的二进制码。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;
相关文档
最新文档