查表法计算CRC

合集下载

[技术栈]CRC校验原理及C#代码实现CRC16、CRC32计算FCS校验码

[技术栈]CRC校验原理及C#代码实现CRC16、CRC32计算FCS校验码

[技术栈]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位。

循环冗余检验(CRC)算法原理

循环冗余检验(CRC)算法原理

循环冗余检验(CRC)算法原理Cyclic R edundancy C heck循环冗余检验,是基于数据计算⼀组效验码,⽤于核对数据传输过程中是否被更改或传输错误。

算法原理假设数据传输过程中需要发送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等。

国际通⾏标准可以参看g(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进⾏运算的⼆进制码。

若gk的⾸位是1,则b=h;若gk的⾸位是0,则b=0,或者跳过此次迭代,上⾯的例⼦中就是碰到0后直接跳到后⾯的⾮零位。

2. 每次迭代,gk的⾸位将会被移出,所以只需考虑第2位后计算即可。

这样就可以舍弃h的⾸位,将b取h的后m位。

⽐如CRC-8的h是111010101,b只需是11010101。

3. 每次迭代,受到影响的是gk的前m位,所以构建⼀个m位的寄存器S,此寄存器储存gk的前m位。

每次迭代计算前先将S的⾸位抛弃,将寄存器左移⼀位,同时将g的后⼀位加⼊寄存器。

crc查表法计算实例

crc查表法计算实例

CRC(循环冗余校验)是一种常用的错误检测技术,其中查表法是一种高效计算CRC 值的方法。

下面是一个使用查表法计算CRC 的示例:```pythondef crc_lookup(data, crc_table):crc = 0xFFFF # 初始CRC 值for byte in data:crc = (crc >> 8) ^ crc_table[(crc ^ byte) & 0xFF]return crcdef calculate_crc(data):crc_table = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF] # CRC 查表# 将数据转换为字节列表if isinstance(data, str):data = data.encode()# 计算CRCcrc = crc_lookup(data, crc_table)return crc# 示例数据data = "Hello, World!"# 计算CRCcrc_result = calculate_crc(data)print(f"CRC Result: {hex(crc_result)}")```在上面的示例中,我们定义了两个函数:`crc_lookup` 和`calculate_crc`。

`crc_lookup` 函数用于执行CRC 查表操作,接受一个数据字节列表和CRC 查表作为参数,返回计算得到的CRC 值。

`calculate_crc` 函数用于将数据转换为字节列表,并调用`crc_lookup` 函数计算CRC 值。

在示例中,我们使用了一个16 位CRC 查表,以及一个示例数据"Hello, World!"。

modbus crc 查表法与计算法

modbus crc 查表法与计算法

Modbus是一种用于串行通信的协议,通常用于工业控制系统中的设备之间的通信。

在Modbus协议中,通信的数据经常需要进行CRC (循环冗余校验)校验以确保数据的准确性。

在实际应用中,我们可以通过查表法或计算法来计算Modbus协议中的CRC校验值。

本文将介绍Modbus CRC的查表法和计算法,并对这两种方法进行比较和分析。

一、Modbus CRC的概念及应用Modbus通信协议是一种用于工业控制系统的通信协议,它规定了设备之间的数据通信格式和规则。

在Modbus协议中,通信的数据需要进行CRC校验以确保数据的完整性和准确性。

CRC校验是一种通过对数据进行处理得到固定长度的校验码,用于校验数据传输的正确性的技术。

Modbus协议中的CRC校验值通常是16位的,可以通过CRC计算器进行计算,并将计算得到的校验值附加到数据传输中。

接收端收到数据后,同样可以通过计算CRC校验值来验证数据的正确性。

二、Modbus CRC的查表法1. 查表法是一种通过预先计算出CRC校验值并存储在表中,然后在实际使用时直接查表得到CRC校验值的方法。

对于Modbus协议中的CRC校验,可以使用一个256个元素的查表来进行计算。

2. 查表法的优点是计算速度快,适用于嵌入式系统或资源有限的设备。

由于CRC校验是通过查表得到的,因此不需要进行复杂的计算,可以节省系统资源和计算时间。

3. 但是查表法的缺点是需要额外的存储空间来存储CRC校验值的查表,对于一些资源有限的设备可能会造成存储空间的浪费。

三、Modbus CRC的计算法1. 计算法是一种通过数学计算来得到CRC校验值的方法。

对于Modbus协议中的CRC校验,可以使用多项式除法来进行计算。

2. 计算法的优点是不需要额外的存储空间来存储查表,因此不会造成存储空间的浪费。

而且计算法可以适用于任何系统,不受资源限制的影响。

3. 但是计算法的缺点是计算速度相对较慢,特别是对于资源有限的嵌入式系统或单片机来说,可能会影响系统的性能。

CRC查表法 计算法

CRC查表法 计算法

}
return ((chCRCHi << 8) | chCRCLo) ;
}
unsigned char data[9]={0x01, 0x10 ,0x00, 0x40 ,0x00, 0x01 ,0x02 ,0x07, 0xD0}; #define length 9 unsigned char *p[length]; void main() {
CRC16=*ptr^CRC16; for (j=0;j< 8;j++) {
tmp=CRC16 & 0x0001; CRC16 =CRC16 >>1; if (tmp) CRC16=CRC16 ^ 0xa001; } *ptr++; } return(CRC16); } void main() { for(j=0;j<10;j++) { p[j]=&data[j]; } CRC=crc16l(*p,length);
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
int CRC=0; int j=0; for(j=0;j<10;j++) {
p[j]=&data[j]; }
CRC=CRC16_1(*p,length);

c语言crc校验程序查表法

c语言crc校验程序查表法

c语言crc校验程序查表法
(原创版)
目录
1.CRC 校验原理
2.C 语言 CRC 校验程序实现
3.查表法在 CRC 校验中的应用
4.实例:使用查表法实现 CRC 校验
正文
一、CRC 校验原理
CRC(Cyclic Redundancy Check,循环冗余校验)是一种基于二进制多项式的数据校验技术。

它通过在数据末尾附加一些校验位,然后接收方在接收到数据后,通过相同的计算方法,对数据进行校验,以判断数据在传输过程中是否发生了改变或损坏。

CRC 校验的主要优点是能够检测出大部分数据传输错误,且计算简单,易于实现。

二、C 语言 CRC 校验程序实现
C 语言中实现 CRC 校验的主要步骤如下:
1.首先,根据需要生成一个二进制多项式。

这个多项式可以是固定的,也可以是随机生成的。

2.将待校验的数据用二进制表示,并在数据末尾添加一些校验位,使得整个数据长度可以被二进制多项式整除。

3.使用二进制多项式去除数据,得到一个余数。

这个余数就是 CRC 校验的结果。

4.在接收端,使用相同的方法计算 CRC 校验结果,然后将其与发送端得到的结果进行比较。

如果二者相同,则认为数据传输正确;如果不同,
则认为数据发生了改变或损坏。

三、查表法在 CRC 校验中的应用
查表法是一种常用的 CRC 校验算法。

它通过预先计算一组 CRC 值,并将其存储在表格中。

在需要进行 CRC 校验时,只需要查找对应的 CRC 值即可。

这种方法的优点是计算速度快,节省存储空间。

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,可见计算无误。

crc校验查表法原理

crc校验查表法原理

crc校验查表法原理CRC(Cyclic Redundancy Check)校验是一种常用的数据传输错误检测方法,广泛应用于计算机网络、通信等领域。

CRC校验的查表法原理是其中一种实现方式,通过查表的方式来进行校验计算,下面将详细介绍这种方法的原理和应用。

1. CRC校验的基本原理CRC校验是一种基于多项式除法的校验方法。

在CRC校验过程中,发送方和接收方约定一个生成多项式(Generator Polynomial),通常记作G(x)。

发送方在发送数据之前,先计算待发送数据的CRC校验值,并将其附加到数据末尾,形成一个完整的帧。

接收方同样计算接收到数据的CRC校验值,并与接收到的CRC校验值进行比较,如果两者相等,则数据传输没有出现错误。

2. 查表法原理查表法是实现CRC校验的一种高效方法。

其基本原理是将CRC校验过程中的除法运算转化为查表操作,从而提高计算效率。

具体步骤如下:(1)生成查表表格:根据生成多项式G(x)的阶数,生成一个2^m 大小的查表表格,其中m为生成多项式的阶数。

(2)数据处理:将待发送的数据按照二进制形式表示,并在数据末尾添加n个0,其中n为生成多项式的阶数。

(3)查表运算:从数据的最高位开始,每次取m位数据,并将其作为查表表格的索引,找到对应的查表值。

然后将查表值与当前数据进行异或运算,并将结果作为下一次计算的数据。

(4)重复上述操作,直到处理完所有数据位。

(5)得到CRC校验值:经过上述计算后,最后剩下的数据即为CRC 校验值,将其附加到原始数据末尾,形成一个完整的帧。

3. 查表法的优势相比于其他计算方法,查表法具有以下几个优势:(1)高效性:通过查表的方式,可以大大提高CRC校验的计算效率,尤其是对于大数据量的情况,查表法比较快速。

(2)易于实现:查表法的实现相对简单,只需要生成查表表格,并根据表格进行查表运算即可。

(3)节省存储空间:通过查表的方式,可以将除法运算转化为查表操作,从而避免了除法运算需要的存储空间。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在硬件实现中,CRC 通常采用线性反馈移位寄存器实现。

其中一个单元对应CRC 的每一比特,图3-2给出了8比特寄存器。

对于移位寄存器中的每一单元,如果在发生器多项式中D 的某次幂为1,那么到下一个单元的连接要经过一个异或门(XOR)。

对于每一传输块,首先将移位寄存器置零;接传输块数据输入移位寄存器,当传输块的所有比特全部输入移位寄存器后,移位寄存器的存储内容就是所要求的CRC 比特。

这些比特以倒序传输,如图3-2,首先传输在最左寄存器中的CRC 比特。

图3-2 8比特CRC 生成移位寄存器
对于上述算法,当输入1个比特时,要经过一系列的异或和移位,才能完成。

上图只是8比特CRC 的实现图,考虑到g CRC24A (D)的多项式,实现更为复杂。

而下行峰值速率又相对很高,采用这种方法显然是达不到需求的速率的。

下面介绍一种更为高效的查表法[17],多核DSP 计算CRC 也使用了查表法。

设传输块有k 比特,CRC 比特数为k n -;下面是按4比特查表计算24比特CRC 的过程。

对于传输块中的二进制序列,可以用下面的多项式表示:
()1011222k k k k m x m m m m --=++++ 式(3-1) 将上式每4个比特组合在一起,如下所示:
()44(1)4011222n n n n m x m m m m --=++
++ 式(3-2)
求此序列的24比特CRC 时,先乘以242(左移24位)后,再除以CRC 的生成多项式()x g ,所得到的余数即为所求的CRC 码。

如下式所示:
()()()()
()
242424
2444(1)
01222222n n n m x m m m g x g x g x g x -=+++
式(3-3) 设:()()()()24
0002r x m Q x g x g x =+
,其中()0r x 为24位二进制余数;将它代入式(3-3)可得:
()()()()()()()()()()()()2424
24044(1)1042424
044(1)102222222222
n n n n
n n m x r x m m Q x g x g x g x g x r x m m Q x g x g x g x --⎡⎤=++++⎢⎥⎣
⎦⎧⎫⎪⎪=++++⎨⎬⎪⎪⎩⎭
式(3-4)
因为,()()()()()4204244000002[2]222h l h l r x r x r x r x r x =+=+ 式(3-5)
其中()0h r x 是()0r x 的高4位,()0l r x 是()0r x 的低20位。

将式(3-5)带入式(3-4)经整理得:
()()()()()()()
24424
24
044(1)01022[]2222
l n
n h n m x r x r m m Q x g x g x g x g x -⎧⎫+⎪⎪=++++⎨⎬⎪⎪⎩
⎭ 式(3-6) 再设:()()()()()()42401
0112[]2l h r x r x r m Q x g x g x g x ++=+,其中()1r x 仍是24位二进制余数。

根据上面的推导过程,以次类推可得:
()()
()()()()
()
24
44(1)01222n n n n m x r x Q x Q x Q x g x g x -=++++
式(3-7) 其中24位二进制余数()n r x 即为要求的CRC 比特。

式(3-7)是按4比特计算CRC 比特的递推公式。

从式子可以看出,输入本4比特后的CRC 比特等于输入本4比特前的CRC 码的低20位左移4位后再加上它右移20位(即取高4位)与将要输入字节之和后的CRC 值。

所以,如果将4位二进制序列的CRC 全部计算出来再存储在表中,则可以通过查表来计算CRC 。

相关文档
最新文档