voidinsertion_sort(intarray[],intfirst,intlast)
{
inti,j;
inttemp;
for(i=first+1;i<last;i++)
{
temp=array[i];
j=i-1;
//与已排序的数逐一比较,大于temp时,该数移后
while((j>=0)&&(array[j]>temp))
{
array[j+1]=array[j];
j--;
}
//存在大于temp的数
if(j!=i-1)
{array[j+1]=temp;}
}
}
CRC码一般在k位信息位之后拼接r位校验位生成。编码步骤如下:
选择产生多项式为1011,把4位有效信息1100编程CRC码即G(X)= X^3+X+1=1011,M(x)=X^3+X^2=1100 。
(1)将待编码的k位信息表示成多项式 M(x)。 得到M(X)=1100,即M(x)=X^3+X^2=1100
(2)将 M(x)左移 r 位,得到 M(x)xr 。则取r=3
M(X)X^3=X^6+X^5=1100000
(3)用r+1位的生成多项式G(x)去除M(x)xr 得到余数R(x)。
则被除数为1100000,除数为1011,进行二进制除法,求得余数为010。
(4)将M(x)xr 与R(x)作模2加,得到CRC码。则CRC校验码为1100010
你这个是CRC16
要实现校验的话,你首先需要知道对方采用的是何种CRC公式
不同的CRC公式 得到的校验码是不一样的
在知道公式的情况下
做crc表,然后按照crc算法,计算这8个字节的整体crc
如果传输没有错误的话,最终的crc值是0
也可以计算前六个的crc,然后和最后两个字节比较,效果是相同的。
求取 CRC,必须先确定一个:生成多项式。
有了这个多项式,才能进行求取 CRC 和进行 CRC校验。
可以搜:
做而论道 CRC
百度一下,即可知道 CRC 的计算方法。
串口通讯中,发送的是字符串或者说是字节数组。接收或发送的总字节数已知,一般最后一个或两个字节为CRC校验字节。你可以做一个子函数,以该字节数组作为函数变量,返回值为CRC校验字节。对于发送数据,将返回的校验字节放在发送字节的最后,然后发送即可;对于接收数据校验,则将子函数返回的校验字节与接收到的校验字节比较,相等即校验通过,不相等则校验失败。
CRC校验码的获取有两种方法,可以用查表法,也可以用多项式法计算。
这几天一直在看CRC校验算法。CRC版本众多,网站上实现算法一大坨,可一开始根本搞不清楚那个是哪个。连续上百度,哔哩哔哩,知乎看了很多解读CRC算法的,终于有了一些眉目,打算写下来,方便日后参考。
CRC算法核心其实只有一种,即二进制除法的实现,版本众多的原因主要有以下几个原因:
CRC字段的长度
多项式公式
初始值
输出是否水平翻转
输入是否水平翻转
结果异或值
我绝大多数的文章都只谈到了CRC字段的长度和多项式公式,没有涉及剩余的三项在crc算法中的应用。
CRC字段的长度 ,字段越长,对于crc算法的校验能力越强。如果我们用出错的概率来评估校验能力的话。N长度的字段,他的校验能力为1/2N。此处的运算符号采用Python语言中的含义。
一般而言,我们取的长度主要有8位,16位和32位。当然也有一些比较奇特的,4位,5位和6位,还有7位。
多项式公式 是我们二进制多项式算法中的除数。不同的算法往往取的多项式是不一样的。
初始值 ,是指CRC字段的初始值。常常是从0和全是1中选择。
输入反转。 具体的 *** 作方法实施将输入的数据按照字节为单位进行水平反转。比如01000001,翻转结果是10000010。
输出翻转 。输出翻转的 *** 作与输入翻转 *** 作是一样的。只是输出翻转是将整个CRC字段进行水平翻转。
结果异或值 ,是用来和 通过上述的算法算出来的结果 进行异或的一个数据值。如果这个值是0的话,那么就相当于没有进行异或。
为什么需要这么多看起来乱七八糟的种类呢。这些算法分别针对不同的数据的检验。针对不同的数据的特性,比如说某些数据,一开始就会有大量的零,如果不采用输入翻转或者初始值的话,那么这些0就对于校验结果没有任何影响。这就如我们想要的结果有出入了,我们希望校验结果和数据是一一对应的,并且是唯一的。如果不唯一那么,校验结果也就失去了意义。因此这么多算法的出现,主要原因就是为了适应不同的数据字符串的特点。
下面就是一些例子了。
验证网站: >
CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或(异或:二进制运算 相同为0,不同为1;0^0=0;0^1=1;1^0=1;1^1=0), 之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,则无需进行异或。重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位。所有的字符处理完成后CRC寄存器内的值即为最终的CRC值。
1.设置CRC寄存器,并给其赋值FFFF(hex)。
2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。 3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。
4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。
5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。
6.重复第2至第5步直到所有数据全部处理完成。
7.最终CRC寄存器的内容即为CRC值。
CRC(16位)多项式为 X16+X15+X2+1,其对应校验二进制位列为1 1000 0000 0000 0101。
CRC是什么东西呢?其实我们大家都不应该会对它陌生,回忆一下?你用过RAR和ZIP等压缩软件吗?它们是不是常常会给你一个恼人的“CRC校验错误”信息呢?我想你应该明白了吧,CRC就是块数据的计算值,它的全称是“Cyclic Redundancy Check”,中文名是“循环冗余码”,“CRC校验”就是“循环冗余校验
以上就是关于CRC16校验是如何校验的就告诉接收到的数据如何校验全部的内容,包括:CRC16校验是如何校验的就告诉接收到的数据如何校验、关于CRC校验码编码方法....如何求得....、求CRC校验计算方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)