CRC_16校验方式的多项式
crc16 1021 多项式
crc16 1021多项式
CRC-16是一种循环冗余校验(Cyclic Redundancy Check)的算法,它使用多项式来计算校验值。
在CRC-16中,常用的多项式是0x1021。
该多项式可以表示为二进制形式:0001 0000 0010 0001。
这个多项式的最高次数是16,因此称为CRC-16。
CRC-16算法对输入数据进行位操作,并生成一个16位的校验码。
具体算法步骤如下:
1. 初始化一个16位寄存器为全1(即0xFFFF)。
2. 对每一个输入字节执行以下操作:
将输入字节与16位寄存器的最高位进行异或操作。
将16位寄存器向左移动一位。
如果异或结果的最低位为1,则将16位寄存器与0x1021进行异或操作。
3. 处理完所有输入字节后,16位寄存器的值就是CRC-16校验码。
需要注意的是,在计算CRC-16校验码时,通常还需要添加预定义的初始值,例如0xFFFF。
并且,最终得到的CRC-16校验码通常是反转的形式,即最高位对应的是输入数据的最后一个字节。
1。
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 码。
很多讲的都是CRC16-CCITT标准-一直想弄明白CRC-16标(汇编)
最近在搞CRC校验,用的是CRC16标准,查看了很多资料发现很多讲的都是CRC16-CCITT标准,一直想弄明白CRC-16标准中的采用查表法的方式中那两个表格中的数是如何求出来的。
可惜没有一个文章仔细的讲,更没有文章给出实例来算一算。
一切只能靠自己了,谁让我喜欢寻根摸底呢。
研究了一下本站会员玉丫子的文章,自己琢磨了琢磨,终于知道是怎么算出来的了。
CRC16算法的生成多项式x^16 + x^15 + x^2 + 1,十六进制表示为0x8005。
CRC16常见的表格中的数据是按照先传输LSB,消息右移进寄存器来计算的。
因此需要判断寄存器的最低位LSB,同时要将0x8005按位颠倒后(0xA001)根据LSB的情况决定是否与寄存器异或即可。
CRC16的表格中对应的数依次为0~255计算出来的CRC值,因此,此处只选取其中一两个数作为实例计算CRC值。
具体步骤如下所示:1)从0~255中选取需要计算的数,将其对应的十六进制数放入一个长度为16的寄存器的低八位,高八位填充0;2)如果寄存器的末位LSB为1,将寄存器的数值右移1位,再与0xA001位异或,否则仅将寄存器右移1位;3)重复第2步,直到低八位全部右移出寄存器;4)寄存器中的值则为校验码。
从0~255中挑选2(对应0x02)计算其CRC值:0x02的CRC-16的表格计算(反向)00000000 00000010 <- 最低位LSB = 0,高八位填充000000000 000000010 右移,高位填充0,并舍弃最后一位----------------- 第一次计算00000000 00000001 <- LSB = 100000000 000000001 右移,舍弃最后一位^10100000 00000001 <-与0xA001异或----------------- 第二次10100000 00000001 <- LSB = 101010000 000000001右移,舍弃最后一位^10100000 00000001 <-与0xA001异或----------------- 第三次11110000 00000001 <- LSB = 101111000 000000001右移,舍弃最后一位^10100000 00000001 <-与0xA001异或----------------- 第四次11011000 00000001 <- LSB = 101101100 000000001右移,舍弃最后一位^10100000 00000001 <-与0xA001异或----------------- 第五次11001100 00000001 <- LSB = 101100110 000000001右移,舍弃最后一位^10100000 00000001 <-与0xA001异或----------------- 第六次11000110 00000001 <- LSB = 101100011 000000001右移,舍弃最后一位^10100000 00000001 <-与0xA001异或----------------- 第七次11000011 00000001 <- LSB = 101100001 100000001右移,舍弃最后一位^10100000 00000001 <-与0xA001异或----------------- 一共右移了八次,得到的结果为CRC11000001 10000001 <- CRC: 0xC1 81从本文最后的附表中可以看出auchCRCHi[]的第三个值就是0x 81,auchCRCLo[]的第三个值就是0xC1,可见计算无误。
crc-16标准规定的生成多项式为g(x)
crc-16标准规定的生成多项式为g(x),介绍CRC-16
CRC-16 (Cyclic Redundancy Check)是一种数据校验技术,是在传输、存储数据时为了确保数据正确性而制定的一种标准。
CRC-16 算法能够鉴别接收到的数据是否被妥善地传输,从而让传输者和接收者都能够确保他们正在使用的数据是没有被篡改的。
CRC-16 标准的生成多项式为g(x),它被定义为:g(x)=x 16+x 15+x 2+1。
这里的x表示无符号位,而1则为最高位。
CRC-16 标准使用多项式来对数据进行校验,根据每一位数据得到的校验和会作为下一个位发送。
如果收到的CRC校验和与原CRC码不同,则说明数据在传输过程中发生了错误,这时就需要重新发送数据。
在实际应用中,CRC-16 一般由接收者在接收到数据时先进行CRC-16 校验码的计算,将计算结果和原来传输的校验码进行对比,如果不一致则说明数据在传输过程中出现了错误,需要重新进行传输。
同时,CRC-16 的计算过程也是可以任意算法实现的,不一定要使用指定的多项式g(x)。
因为CRC-16校验算法的计算过程及其结果计算都具有较轻松的容错能力,所以CRC-16 已经成为一种比较主流的数据可靠性保证方案,广泛用于电脑系统、数字通信、EN877标准等领域。
总结起来,CRC-16 通过校验算法和生成多项式g(x)使得发送者和接收者可以确保正在使用的数据是安全的,同时又能够检测出数据传输的可靠性,对保证数据的完整性和安全性具有重要的作用。
最详细易懂的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校验的矩阵写法通常是通过一个16x16的矩阵来实现的,这个矩阵包含了CRC校验的所有运算步骤。
首先,我们需要定义一个预设的16位多项式,通常用一个16
位的二进制数表示,比如0x8005。
然后,我们需要构建一个16x16
的矩阵,矩阵的每一行代表一个比特位的操作,从0到15,而每一
列代表一个输入比特位的值。
矩阵的元素是在进行CRC16校验计算
时需要进行的位操作。
具体来说,矩阵的每一行包含了一个16位的二进制数,代表了
对应比特位的操作。
这些操作通常包括了位移、异或等操作,用来
计算CRC校验码。
通过对输入数据进行逐位的处理,并根据矩阵中
的预定义操作进行计算,最终得到CRC16校验码。
总的来说,CRC16校验的矩阵写法是通过一个16x16的矩阵来
实现的,这个矩阵包含了CRC校验的所有运算步骤,通过对输入数
据进行逐位的处理,并根据矩阵中的预定义操作进行计算,最终得到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 校验,如果计算出的校验位与接收到的校验位不一致,说明数据在传输过程中出现错误,接收方会立即丢弃该数据帧。
crc16-ccitt标准
crc16 ccitt标准CRC16 CCITT(循环冗余校验16位CCITT标准)是一种广泛用于通信和数据传输中的错误检测技术。
在本文中,我们将一步一步回答关于CRC16 CCITT标准的问题,并对其原理和应用进行详细解释。
第一步:CRC是什么意思?CRC代表循环冗余校验(Cyclic Redundancy Check),是一种通过计算和比较校验码来检测和纠正数据传输中的错误的技术。
校验码是在发送数据之前添加到数据中的,接收端使用相同的算法重新计算校验码,然后将其与接收到的校验码进行比较,以检测任何错误。
第二步:CRC16 CCITT是什么?CRC16 CCITT是使用16位宽度进行计算的CRC校验算法,其标准由国际电报电话咨询委员会(Consultative Committee for International Telegraphy and Telephony,简称CCITT)制定。
CRC16 CCITT使用的多项式是x^16 + x^12 + x^5 + 1。
第三步:CRC16 CCITT的工作原理是什么?CRC16 CCITT的工作原理基于多项式除法。
它将数据和一个预设的16位初始值一起输入算法。
算法按位将数据与多项式进行按位异或运算。
然后,算法将结果进行移位,直到所有的数据位都被处理完毕。
最后,算法得到一个16位的校验码,该码附加在数据中发送给接收端。
第四步:CRC16 CCITT的校验方法是什么?接收端使用相同的多项式和初始值将接收到的数据进行计算,得到一个校验码。
然后,接收端将该校验码与发送端附加的校验码进行比较。
如果两个校验码一致,表明数据在传输过程中没有错误。
如果两个校验码不一致,则表明数据传输过程中存在错误。
第五步:CRC16 CCITT的应用领域有哪些?CRC16 CCITT广泛应用于通信和数据传输领域。
它在串行通信中的应用非常常见,可以用于检测串行数据传输中的位错误、丢失、重复或颠倒。
crc16 原理
crc16 原理CRC16是循环冗余校验的一种算法,能够对数据进行快速、简单的校验,广泛应用在数据通信和存储领域。
本文将详细介绍CRC16的原理和应用。
1. CRC16是什么?CRC16是循环冗余校验的一种算法,它将数据通过特定的计算方式转换为一个16位的校验值。
发送方可以将这个校验值附加在数据中一起发送给接收方,接收方则通过对收到的数据再次进行CRC16计算,并与附加的校验值进行比较,从而检测数据是否在传输或存储过程中出现错误或损坏。
2. CRC16原理CRC16算法使用了多项式除法的思想。
具体步骤如下:2.1初始化将CRC寄存器初始化为一个预设值(通常为全1或全0),这个值决定了CRC16算法的种类。
2.2数据处理将数据依次按位放入CRC寄存器,从高位到低位进行处理。
处理的方式是将CRC寄存器的高位与数据位进行异或操作,然后再将结果右移一位。
如果异或操作后的最高位为1,则还需要与一个预设的多项式进行异或操作。
2.3重复处理重复以上的数据处理步骤,直到所有数据位都经过处理。
2.4结果输出处理完所有数据位后,CRC寄存器中存储的就是CRC16校验值。
可以将其作为一个附加的校验字节与原数据一起发送给接收方。
3. CRC16的应用CRC16算法具有快速、简单的特点,广泛应用于各种通信和存储系统中,包括但不限于以下几个领域:3.1数据通信在数据通信中,发送方通过对发送的数据进行CRC16计算,将CRC16校验值附加在数据中一起发送给接收方。
接收方接收到数据后,再次进行CRC16计算,将计算得到的校验值与附加的校验值进行比较,如果相等,则认为数据传输正确无误;如果不相等,则说明数据在传输过程中出现错误或损坏。
3.2存储校验在存储系统中,CRC16算法可以用于对数据进行校验,以确保数据的完整性和一致性。
在数据写入存储介质之前,计算数据的CRC16校验值并将其存储。
当数据被读取时,再次计算数据的CRC16校验值,并将计算得到的校验值与存储的校验值进行比较,从而检测数据是否损坏或被篡改。
crc16查表法中表格数据计算方法及实例
最近在搞CRC校验,用的是CRC16标准,查看了很多资料发现很多讲的都是CRC16-CCITT标准,一直想弄明白CRC-16标准中的采用查表法的方式中那两个表格中的数是如何求出来的。
可惜没有一个文章仔细的讲,更没有文章给出实例来算一算。
一切只能靠自己了,谁让我喜欢寻根摸底呢。
研究了一下本站会员玉丫子的文章,自己琢磨了琢磨,终于知道是怎么算出来的了。
CRC16算法的生成多项式x^16 + x^15 + x^2 + 1,十六进制表示为0x8005。
CRC16常见的表格中的数据是按照先传输LSB,消息右移进寄存器来计算的。
因此需要判断寄存器的最低位LSB,同时要将0x8005按位颠倒后(0xA001)根据LSB的情况决定是否与寄存器异或即可。
CRC16的表格中对应的数依次为0~255计算出来的CRC值,因此,此处只选取其中一两个数作为实例计算CRC值。
具体步骤如下所示:1)从0~255中选取需要计算的数,将其对应的十六进制数放入一个长度为16的寄存器的低八位,高八位填充0;2)如果寄存器的末位LSB为1,将寄存器的数值右移1位,再与0xA001位异或,否则仅将寄存器右移1位;3)重复第2步,直到低八位全部右移出寄存器;4)寄存器中的值则为校验码。
从0~255中挑选2(对应0x02)计算其CRC值:0x02的CRC-16的表格计算(反向)00000000 00000010 <- 最低位LSB = 0,高八位填充000000000 000000010 右移,高位填充0,并舍弃最后一位----------------- 第一次计算00000000 00000001 <- LSB = 100000000 000000001 右移,舍弃最后一位^10100000 00000001 <-与0xA001异或----------------- 第二次10100000 00000001 <- LSB = 101010000 000000001右移,舍弃最后一位^10100000 00000001 <-与0xA001异或----------------- 第三次11110000 00000001 <- LSB = 101111000 000000001右移,舍弃最后一位^10100000 00000001 <-与0xA001异或----------------- 第四次11011000 00000001 <- LSB = 101101100 000000001右移,舍弃最后一位^10100000 00000001 <-与0xA001异或----------------- 第五次11001100 00000001 <- LSB = 101100110 000000001右移,舍弃最后一位^10100000 00000001 <-与0xA001异或----------------- 第六次11000110 00000001 <- LSB = 101100011 000000001右移,舍弃最后一位^10100000 00000001 <-与0xA001异或----------------- 第七次11000011 00000001 <- LSB = 101100001 100000001右移,舍弃最后一位^10100000 00000001 <-与0xA001异或----------------- 一共右移了八次,得到的结果为CRC11000001 10000001 <- CRC: 0xC1 81从本文最后的附表中可以看出auchCRCHi[]的第三个值就是0x 81,auchCRCLo[]的第三个值就是0xC1,可见计算无误。
CRC16计算方法
CRC-16校验码计算方法
常用查表法和计算法。
计算方法一般都是:
(1)、预置1个16位的寄存器为十六进制FFFF(即全为1),称此寄存器为CRC 寄存器;
(2)、把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC 寄存器的低
8位相异或,把结果放于CRC寄存器,高八位数据不变;
(3)、把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;
(4)、如果移出位为0:重复第3步(再次右移一位);如果移出位为1,CRC 寄存器与多
项式A001(1010 0000 0000 0001)进行异或;
(5)、重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;(6)、重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;
(7)、将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换;
(8)、最后得到的CRC寄存器内容即为:CRC码。
以上计算步骤中的多项式A001是8005按位颠倒后的结果。
查表法是将移位异或的计算结果做成了一个表,就是将0~256放入一个长度为16位的寄存器中的低八位,高八位填充0,然后将该寄存器与多项式0XA001按照上述3、4步骤,直到八位全部移出,最后寄存器中的值就是表格中的数据,高八位、低八位分别单独一个表。
16位crc校验计算程序
16位crc校验计算程序16位CRC校验计算程序1. 简介CRC(Cyclic Redundancy Check)循环冗余校验,是一种数据传输错误检测技术。
它通过在发送端和接收端对数据进行多项式编码和解码来实现数据的完整性验证。
2. 原理CRC校验利用生成多项式G(x)对待传输的数据D(x)进行除法运算,得到余数R(x),将其附加到原始数据后面形成带有冗余信息的新序列T(x),然后将T(x)传送给接收方。
接收方同样使用相同的生成多项式G(x)对接收到的序列进行除法运算,如果余数为0,则认为该序列无误;否则就认为该序列存在差错。
3. 实现步骤(1)定义生成多项式G(X)(2)在待传输的数据D(X)末尾添加k个零作为低阶系数,并且使得这个新构造出来的n+k位二进制串可以被G(X)整除。
(3)将构造好了的n+k位二进制串按照字节分组。
(4)每一组都与一个初始值相异或,并且依次处理每一个字节。
(5)最终得到一个16位长数字作为结果。
4. 代码实现unsigned short crc16(unsigned char *data, unsigned int length){const unsigned short generator = 0x1021; // CRC-CCITT 标准生成多项式 x^16 + x^12 + x^5 + 1 (0x1021) unsigned short crc = 0xFFFF; for (unsigned int i = 0; i < length; ++i){crc ^= data[i] << 8;for (int j = 0; j < 8; ++j){if ((crc & 0x8000))crc = (crc << 1) ^ generator;elsecrc <<= 1;}} return crc;}5. 总结CRC校验是一种简单而有效地检测通信中是否发生错误并纠正错误方法。
crc16余式查表法对应的多项式公式
标题:CRC16余式查表法对应的多项式公式目录1. 什么是CRC16余式查表法2. CRC16余式查表法的原理3. CRC16余式查表法所对应的多项式公式4. CRC16余式查表法的应用5. 结论正文1. 什么是CRC16余式查表法CRC(Cyclic Redundancy Check)循环冗余校验是一种常用的数据校验方法,用于检测数据传输或存储过程中出现的错误。
CRC16是一种16位的循环冗余校验算法,它通过对待校验数据进行预先约定的除法运算来生成校验码。
在实际应用中,可以使用不同的生成多项式来对数据进行校验,其中CRC16余式查表法就是一种常见的实现方式。
2. CRC16余式查表法的原理CRC16余式查表法的核心思想是利用一个预先生成的查表来快速计算数据的校验码。
具体来说,它首先需要一个预先生成的256个16位二进制数的查表,对于每个8位的输入数据字节,它将根据这个字节的值从查表中找到对应的16位余式,并将其与之前的余式进行异或计算,得到新的余式。
通过重复这个过程直到所有数据字节都被处理完毕,最终生成的余式就是数据的CRC16校验码。
3. CRC16余式查表法所对应的多项式公式CRC16余式查表法对应的多项式公式可以用如下形式表示:G(x) = x^16 + x^15 + x^2 + 1其中,G(x)是一个16位的多项式,它对应了CRC16的生成多项式。
在实际计算中,可以直接利用这个多项式来进行CRC16的计算,而不需要每次都对16位的二进制数进行除法运算。
这样就大大提高了计算的效率,特别是对于嵌入式系统等资源受限的环境来说,CRC16余式查表法提供了一种高效的数据校验算法。
4. CRC16余式查表法的应用CRC16余式查表法广泛应用于数据通信、存储和传输的领域。
由于它计算效率高、实现简单且不依赖除法运算,因此被广泛应用在各种需要数据校验的场景中,如网络通信协议(如Modbus、Profibus等)、文件传输(如ZMODEM协议、XMODEM协议等)以及存储介质(如磁盘、闪存等)等。
【转】crc16几种标准校验算法及c语言代码
【转】crc16⼏种标准校验算法及c语⾔代码⼀、CRC16校验码的使⽤ 现选择最常⽤的CRC-16校验,说明它的使⽤⽅法。
根据Modbus协议,常规485通讯的信息发送形式如下: 地址功能码数据信息校验码 1byte 1byte nbyte 2byte CRC校验是前⾯⼏段数据内容的校验值,为⼀个16位数据,发送时,低8位在前,⾼8为最后。
例如:信息字段代码为: 1011001,校验字段为:1010。
发送⽅:发出的传输字段为: 1 0 1 1 0 0 1 1 0 10 信息字段校验字段 接收⽅:使⽤相同的计算⽅法计算出信息字段的校验码,对⽐接收到的实际校验码,如果相等及信息正确,不相等则信息错误;或者将接受到的所有信息除多项式,如果能够除尽,则信息正确。
⼆、CRC16校验码计算⽅法 常⽤查表法和计算法。
计算⽅法⼀般都是: (1)、预置1个16位的寄存器值0xFFFF,称此寄存器为CRC寄存器; (2)、把第⼀个8位⼆进制数据(既通讯信息帧的第⼀个字节)与16位的CRC寄存器的低 8位相异或,把结果放于CRC寄存器,⾼⼋位数据不变; (3)、把CRC寄存器的内容右移⼀位(朝⾼位)⽤0填补最⾼位,并检查右移后的移出位; (4)、如果移出位为0:重复第3步(再次右移⼀位);如果移出位为1,CRC寄存器与⼀多 项式(A001)进⾏异或; (5)、重复步骤3和4,直到右移8次,这样整个8位数据全部进⾏了处理; (6)、重复步骤2到步骤5,进⾏通讯信息帧下⼀个字节的处理; (7)、将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的⾼、低 字节进⾏交换; (8)、最后得到的CRC寄存器内容即为:CRC码。
以上计算步骤中的多项式A001是8005按位颠倒后的结果。
查表法是将移位异或的计算结果做成了⼀个表,就是将0~256放⼊⼀个长度为16位的寄存器中的低⼋位,⾼⼋位填充0,然后将该寄存器与多项式0XA001按照上述3、4步骤,直到⼋位全部移出,最后寄存器中的值就是表格中的数据,⾼⼋位、低⼋位分别单独⼀个表。
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常见几个标准的算法及C语言实现
CRC16常见⼏个标准的算法及C语⾔实现CRC16常见的标准有以下⼏种,被⽤在各个规范中,其算法原理基本⼀致,就是在数据的输⼊和输出有所差异,下边把这些标准的差异列出,并给出C语⾔的算法实现。
CRC16_CCITT:多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在前,⾼位在后,结果与0x0000异或CRC16_CCITT_FALSE:多项式x16+x12+x5+1(0x1021),初始值0xFFFF,低位在后,⾼位在前,结果与0x0000异或CRC16_XMODEM:多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在后,⾼位在前,结果与0x0000异或CRC16_X25:多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在前,⾼位在后,结果与0xFFFF异或CRC16_MODBUS:多项式x16+x15+x2+1(0x8005),初始值0xFFFF,低位在前,⾼位在后,结果与0x0000异或CRC16_IBM:多项式x16+x15+x2+1(0x8005),初始值0x0000,低位在前,⾼位在后,结果与0x0000异或CRC16_MAXIM:多项式x16+x15+x2+1(0x8005),初始值0x0000,低位在前,⾼位在后,结果与0xFFFF异或CRC16_USB:多项式x16+x15+x2+1(0x8005),初始值0xFFFF,低位在前,⾼位在后,结果与0xFFFF异或多项式产⽣:如x16+x12+x5+1x16表⽰第16位为1,x5表⽰第5位为1(1 << 16) | (1 << 12) | (1 << 5) | (1) = 0x11021但是CRC16只取低16位,写成16进制数就是 0x1021CRC16的算法原理:1.根据CRC16的标准选择初值CRCIn的值。
2.将数据的第⼀个字节与CRCIn⾼8位异或。
CRC校验PLC算法
CRC校验PLC算法CRC(Cyclic Redundancy Check)是一种常用的错误检测算法,广泛应用于数据通信、网络传输、存储等领域。
在PLC(可编程逻辑控制器)中,CRC校验算法被用来验证数据的完整性,以确保数据的可靠传输。
首先,需要选择一个合适的生成多项式。
生成多项式是CRC校验算法的核心部分,可以选择不同的生成多项式来适应不同的应用场景。
常用的生成多项式有CRC-8、CRC-16和CRC-32等。
生成多项式通常以二进制表示,如CRC-16的生成多项式为X^16+X^15+X^2+1接下来是除法运算,即将待校验的数据与生成多项式进行除法运算。
首先,将待校验的数据左移生成多项式的位数,然后进行异或运算。
重复这个过程,直到无法再进行除法运算为止。
最后所得到的余数为CRC校验码。
最后一步是余数校验,即将计算得到的CRC校验码与接收到的校验码进行比较。
如果两者相等,表明数据传输没有错误;如果不相等,将发生数据错误,需要重新发送数据。
CRC校验算法的特点是简单、高效、可靠。
它能够检测出多位错误,对于一位错误的检测率高达99.99%。
由于CRC校验算法只对数据进行检测,而不对错误进行纠正,因此在实际应用中,往往与其他纠错算法(如重复冗余校验码)结合使用,以提高错误的检测和纠正能力。
CRC校验算法在PLC中的应用是非常广泛的。
在数据通信方面,PLC 会将传感器或执行器的状态信息通过通信模块发送给上位机或其他设备,CRC校验可以确保数据传输的准确性。
在存储方面,PLC会将数据写入存储器中,在读取数据时,CRC校验可以验证数据的完整性,防止出现数据丢失或损坏。
总之,CRC校验算法是一种常用的错误检测算法,广泛应用于PLC等领域。
它通过生成多项式、除法运算和余数校验的步骤,对数据进行校验,保证数据传输的可靠性。
在实际应用中,CRC校验算法可以与其他纠错算法结合使用,提高错误检测和纠正的能力,确保数据的安全传输。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ulong g_ulTable[256];
// CRC_16方式校验的初始化函数, 计算CRC_16余数表.
void _far CRC16Init(void)
{ቤተ መጻሕፍቲ ባይዱ
uint nRemainder;
int n, m;
ulong *pulTable = g_ulTable;
for(n = 0; n < 256; n ++)
nRemainder = (uint)*(pulTable + index) ^ (nRemainder << 8);
}
nRet = (uint)CRCBitReflect(nRemainder, 16) ^ 0x0000;
return(nRet);
}
// 反转数据的比特位, 反转后MSB为1.
#define CRC16_POLYNOMIAL 0x1021 // CRC_16校验方式的多项式.
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
typedef enum tagBoolean { FALSE, TRUE } bool;
}
{
nRemainder = (uint)n << 8;
for(m = 8; m > 0; m --)
{
if(nRemainder & 0x8000)
{
nRemainder = (nRemainder << 1) ^ CRC16_POLYNOMIAL;
}
else
{
nRemainder = (nRemainder << 1);
}
}
*(pulTable + n) = nRemainder;
}
}
// 以CRC_16方式计算一个数据块的CRC值.
// pucData - 待校验的数据块指针.
// nBytes - 数据块大小, 单位是字节.
// 返回值是无符号的长整型, 其中低16位有效.
ulong _far CRC16Calc(uchar *pucData, int nBytes)
int n;
for(n = 0; n < nBits; n ++)
{
if(ulData & 0x00000001L)
{
ulResult |= (ulong)(1L << ((nBits - 1) - n));
}
ulData = (ulData >> 1);
}
return(ulResult);
{
uint nRemainder, nRet;
int n;
uchar index;
ulong *pulTable = g_ulTable;
nRemainder = 0x0000;
for(n = 0; n < nBytes; n ++)
{
index = (uchar)CRCBitReflect(*(pucData + n), 8) ^ (nRemainder >> 8);
// 反转前: 1110100011101110 0010100111100000
// 反转后: 1111001010001110 1110001011100000
ulong _far CRCBitReflect(ulong ulData, int nBits)
{
ulong ulResult = 0x00000000L;