关于CRC校验实现程序解释(CRC16为例)

本文本文主要说两件事,一是对于网上一些Demo的解释,借用网友思路的Demo,如有雷同纯属巧合。二是关于数据反转的问题。

在《CRC原理——为什么算出来的CRC校验码结果总不一样?》原文链接(https://www.jianshu.com/p/2551ea7dbb14)中解释了关于CRC的一些基本概念,这里谈谈通过高级语言编程的实现思路。

CRC的实现步骤(以crc16为例,宽度为16位):

(1)确定模型标准

(2)将待发送数据与预定初始值进行异或得到新的数据M

(2)在M后面(右侧)加上16个0得到数据N

(3)将N与模型标准除数进行异或,得到余数

(4)将余数与结果异或值进行异或,得到目标值

这里不含输入输出值的正反转。我们很容易会发现一些问题,当所处理的数据量不大时,这样的方法是没有问题的,但实际上我们一般传递的数据都是非常巨大的,如果通过上述方案,恐怕计算机的空间都不够我们使用的,所以我们需要用另一种方法,这里引用网友的思路(不知道谁的,仅适用于常用的8位数据传输,校验宽度为16位,无反转):

(1)预制一个16位的存储空间CRC,并赋初始值

(2)将要发送的数据打包成一个Byte数组(将数据分成多个Byte存储)

(3)将第一个数据左移8位并与CRC当前值进行异或,结果放入CRC

(4)判断当前CRC的最高位(MSB)是否为1,若为1,则左移一位,将MSB移出,并在LSB(最低位)补0,将新的数据与简记式Poly进行异或,结果存入CRC;

若MSB为0则只进行左移操作。

(5)重复步骤3-4直至8个数据移动完毕,此时CRC中的值就是我们要的校验码。

以下附上一段网上https://blog.csdn.net/u012923751/article/details/80352325的C代码

这里我再解释以下变量,如果采用的是左移方式的计算,多项式定为G(X)=X16+X15+X2+1(16#18005),则POLY采用的值应该是16#8005(简记式),其实我们可以看得到这个算法本身就是手工除法的做法了,不过还是需要验证一下。

我这里选用数据为16#AA,多项式沿用16#18005,初始值为0,结果异或值为0,不反转,其手工计算方法如下:


接下来我们验证一下C语言算法:


结果是一致的。

这种算法的好处是,解决了之前说的数据量的问题,每次只处理8个位,等到所有数据处理完后就能得到我们要的数值,其中应用了模2除法交换特性就不多说了。

这是最直接的计算方法,也非常容易理解,但是实际运用过程中,我们还会遇到数据反转的情况,这里以CRC_16 Modbus为例,其二项式为16#18005,初始值16#FFFF,结果异或值16#0000,输入值输出值均反转。

出现这种情况的原因其实就是因为Modbus在传输数据的时候是低位优先的,也就是它是从0位出去的,然后接收端是从0位接收的,因此,如果我们要进行计算,那就要重写一个算法,先把原始数据反转过来,这就增加了程序的工作量。因此,程序员发明了另一个方法,使用反转二项式来解决这个问题。

先用一个实例来说明一下,后面我们解释反转算法的合理性。

以下实例采用CRC16 Modbus 输入输出反转,初始值16#FFFF,多项式16#18005

反转算法的思路是:

(1)预制一个16位的存储空间Preset,并赋初始值(如16#FFFF)

(2)将要发送的数据打包成一个Byte数组(将数据分成多个Byte存储)

(3)将第一个数据左移8位并与CRC当前值进行异或,结果放入Preset

(4)判断当前CRC的最低位(LSB)是否为1,若为1,则右移一位,将LSB移出,并在MSB(最高位)补0,将新的数据与简记式16#A001(16#8005反转)进行异或,结果存入Preset;

若LSB为0则只进行右移操作。

(5)重复步骤3-4直至8个数据移动完毕,此时CRC中的值就是我们要的校验码。

以下为SCL源码:

反转计算其实是一种反向除法,利用的是模2除法不借位特性,但为什么这么做呢?

先做一个理论分析,假设我们发送数据16#AB(1010 1011),这是正向发送,但由于modbus的LSB优先传输特点,接收方实际收到的数据为1101 0101,但它还是会使用16#18005来进行计算,因此,两边其实是一个镜像关系。

语言能力有限,接下来就以16#AB(1010 1011)来验证一下算法的正确性,这里初始值设为0,方便计算,不影响程序:

首先是发送方:


然后再看接收方,接收方收到的数据应该为1101 0101 1000+0010 1111 1101

验算如下:


接收到的验算无余数,证明结果正确,至于反转为什么是16#A001而不是16#14001,与16#8005的结果是一样的,在这套算法中,首位的1被舍去了,反转算法则应该舍去末尾的1。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 首先要讲一下CRC16是什么 。 CRC是一种常见的校验,而CRC16呢,主要是因为校验结果是16个位,当然还有C...
    一路向东_lxd阅读 23,413评论 1 4
  • 电力系统是一个综合化的系统,作为一个熟练的电工,对于通信有着一定的认识。否则很多问题,我们将无从下手。首先我们从广...
    洪城小电工阅读 116,987评论 8 33
  • 一、为什么要进行数据校验 数据校验是为保证数据的完整性,用一种指定的算法对原始数据计算出的一个校验值。接收方用同样...
    用电热毯烤猪阅读 19,843评论 0 49
  • 最近刚好有时间,整理了一下关于CRC的资料,详细对比了下程序的实现过程和原理,当然,高手都是不在意的。 本文主要介...
    漠漠彡阅读 26,375评论 0 10
  • 详解大端模式和小端模式 嵌入式开发交流群280352802,欢迎加入! 一、大端模式和小端模式的起源 关于...
    l日月之明l阅读 1,048评论 0 0