CRC16 的生成及校验原理「建议收藏」

CRC16 的生成及校验原理「建议收藏」参考:https://blog.csdn.net/niepangu/article/details/45499383计算CRC的过程,就是用一个特殊的“除法”,来得到余数,这个余数就是CRC。&#1

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

参考:https://blog.csdn.net/niepangu/article/details/45499383

 

计算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 ,用^1001

  1010

^ 1001

—————

  0011

第三次XOR,去掉最高位,加入下一位0,得0110 ,这样最高位是1,所以下个商是0 ,用^0000

  0110

^ 0000

————-

  0110

最后一次XOR后得到0110,最高位的0可以消掉了,得到余数为110,即6 
注意,余数不是0110,而是110,因为最前面那个0已经被XOR后消掉了!

 

 

可见,除法(XOR)的目的是逐步消掉最高位的1或0! 
由于过程是XOR的,所以商是没有意义的,我们不要。我们要的是余数。 
 
余数110是1111000的CRC吗?不是! 
余数110是1111(即十进制15)的CRC!!! 
为什么?因为CRC是和数据一起传送的,所以数据后面要加上CRC。 
数据1111加上CRC110后,变成1111110,再传送。接收机收到1111110后,除以除数1001,余数为
000,正确;如果余数不为0,则说明传送的数据有误!这样完成CRC校验。 
即发送端要发送1111,先在1111后加000,变成1111000,再除以1001得到余数110,这个110
就是CRC,将110加到数据后面,变成1111110,发送出去。 
接收端收到1111110,用它除以1001,计算得余数为000,就说明收到的数据正确。 
所以原始数据后面要先扩展出3位0,以容纳CRC值! 
会发现,在上面的除法过程中,这3位0,能保证所有的4个数据位在除法时都能够被处理到!不然做
一次除法就到结果了,那是不对的。这个概念后面要用到。 

 

二、  生成项 
上面例子中,生成项是1001,共4位比特,最高位的1,实际上在除法的每次XOR时,都要消掉,所
以这个1可不做参考,后3位001才是最重要的!001有3位,所以得到的余数也是3位,因为最后一次除
法XOR时,最高位消掉了。所以CRC就是3位比特的。 
CRC是3比特,表示它的宽度W=3。也就是说,原始数据后面要加上W=3比特的0进行扩展! 
生成项的最低位也必须是1,这是规定的。 
生成项1001,就等效于g(x)=x2+1 
生成项也可以倒过来写,即颠倒过来,写成1001,这里倒过来的值是一样的。 
 
再如CRC32的生成项是: 
1 0000 0100 1100 0001 0001 1101 1011 0111  (33个比特) 
即g(x)= x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1 
颠倒过来,就可以写成1110 1101 1011 1000 1000 0011 0010 0000 1 
一般生成项简写时不写最高位的1,故生成项是0x04C11DB7,颠倒后的生成项是0xEDB88320 
CRC32的生成项是33比特,最高位是消掉的,即CRC值是32比特(4个字节),即宽度W=32,就是说,
在计算前,原始数据后面要先扩展W=32个比特0,即4个0x00字节。 
 
注意:我看到网上CRC32的POLY有0x04C10DB7这个值的,它和正规的POLY值不同,需要注意! 
 
颠倒过来,即是镜像,为什么要颠倒,后述。 

拿运 CRC CCITT-16 为例子,行下面的代码,CRC_acc = 0xFFFF;CRC_input[0] = 0x63; 返回校验值CRC.

unsigned short UpdateCRC(unsigned short CRC_acc, unsigned char *CRC_input, unsigned int len)
{
	unsigned char i,k = 0; 
	#define POLY_  0x1021
	while (len--)
	{
		CRC_acc = CRC_acc ^ (CRC_input[k++] << 8);
		printf("CRC_input:%d   : %s\n", CRC_input[0], itoa(CRC_input[0], binbuf, 2));
		printf("CRC_input:%x :%s\n", CRC_acc, itoa(CRC_acc, binbuf, 2));
		printf("POLY_    :%x :%s\n\n", POLY_, itoa(POLY_, binbuf, 2));
		printf("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n");
		for (i = 0; i < 8; i++)
		{
			if ((CRC_acc & 0x8000) == 0x8000)
			{
				printf("chushi   :%x    :%s\n", 0, itoa(CRC_acc, binbuf, 2));
				CRC_acc = CRC_acc << 1;
				printf("you yi   :%x    :%s\n", 0, itoa(CRC_acc, binbuf, 2));
				CRC_acc ^= POLY_;
				printf("POLY_1   :%x    :%s\n\n", 0, itoa(CRC_acc, binbuf, 2));
			}
			else
			{
				printf("chushi   :%x    :%s\n", 0, itoa(CRC_acc, binbuf, 2));
				CRC_acc = CRC_acc << 1;
				printf("POLY_0   :%x    :%s\n\n", 0, itoa(CRC_acc, binbuf, 2));
			}
		}
	}
	return CRC_acc;
}

  CRC16 的生成及校验原理「建议收藏」

CRC16 的生成及校验原理「建议收藏」

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/167917.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C语言运算符优先级列表(超详细)[通俗易懂]

    C语言运算符优先级列表(超详细)[通俗易懂]每当想找哪个运算符优先级高时,很多时候总是想找的就没有,真让人气愤!现在,终于有个我个人觉得非常全的,分享给大家。初级运算符()、[]、-&gt;、. 高于 单目运算符  高于 算数运算符(先乘除后加减) 高于 关系运算符  高于  逻辑运算符(不包括!)  高于  条件运算符  高于  赋值运算符 高于  逗号运算符。位运算符的优先级比较分散。除了赋值运算符、条件运算…

    2022年10月5日
    3
  • CIFAR-10 数据集「建议收藏」

    CIFAR-10 数据集「建议收藏」CIFAR-10数据集简介CIFAR-10是由Hinton的学生AlexKrizhevsky和IlyaSutskever整理的一个用于识别普适物体的小型数据集。一共包含10个类别的RGB彩色图片:飞机(a叩lane)、汽车(automobile)、鸟类(bird)、猫(cat)、鹿(deer)、狗(dog)、蛙类(frog)、马(hor…

    2022年4月19日
    41
  • hive sql分页[通俗易懂]

    hive sql分页[通俗易懂]查出线上线下会员支付超过100的 select*from(  selecta.id,b.mobile,a.totalmoneyfrom (SELECTsum(totalmoney)totalmoney,idFROM  (SELECTt.totalmoney,d.idFROM(  SELECTsum(totalmoney)totalmoney,vipcardn…

    2022年10月21日
    2
  • 微信朋友圈如何自动点赞

    微信朋友圈如何自动点赞我一直都不太喜欢给别人点赞,某一年(貌似是17年)微信出了一次朋友圈年报,那一整年我就点出去了几个赞,要知道当时我微信好友应该有300+。我觉得这是我不喜欢参与社交活动在网络世界的一种体现吧。不给别人点赞也没啥坏处,但你不评不赞,难免会让你和好友之间有些疏远,给别人点赞吧我又嫌麻烦,于是一直想着做个自动点赞的东西,今天基本实现了,虽然诸多不完整和诸多限制,但还是决定分享出来,主要是我觉得还挺好玩的。Autojs先来介绍下Autojs,看githubid貌似是个95后,真是年轻有为了。我这个朋…

    2022年5月4日
    116
  • 中小型企业局域网的组网方案

    中小型企业局域网的组网方案中小型企业局域网的组网方案1.中小型企业局域网的组网方案2.背景和发展情况分析计算机网络技术的迅猛发展,我们当今社会已经步入到了一个信息化时代。人们可以通过网络就可以获取更多的信息资料,人们的生活和工作方式也已经发生了翻天覆地的巨大变化。随着组网技术的发展,中小型企业中的网络连接就出现了局域网的概念,它是指将一定范围内的计算机应用一定的计算机技术连接在一起,从而实现多台电脑同时共享公用网络资源。这种局域网手段将更大的方便局域网内的用户,还可以节省大笔的成本费用和网络开支。对于中小型企业来说,其网络建设

    2022年7月12日
    22
  • Idea实现WebService实例

    Idea实现WebService实例因为工作需要,数据传输部分需要使用webservice实现,经过两天的研究,实现了一个简单的例子,具体方法如下。首先需要新建一个项目,如图:下一步点击finish,然后会生成一个webservice项目,在HelloWorld类里面写自己的方法,在file下编译一下这个类,不编译,idea会提示不通过,编译后需要将为该服务发布WSDL文件,此文件必须生成,如下图:选择需要发

    2022年7月21日
    71

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号