cs校验码计算方法
- 格式:doc
- 大小:12.07 KB
- 文档页数:1
电子式三相多功能电能表通信规约该通信规约是参照《中华人民共和国电力行业标准(DL/T 645—1997)》多功能电能表通信规约(1998—02—10发布,1998—06—01实施)而制定的。
1.1 字节格式每字节含8位二进制码,传输时加上一个起始位(0)、一个偶校验位和一个停止位(1)共11位。
其传输序列如图1。
D0是字节的最低有效位,D7是字节的最高有效位。
先传低位,后传高位。
起始位 8位数据偶校验位停止位图1 字节传输序列1.2 帧格式帧是传送信息的基本单元。
帧格式如图2所示。
图2 帧格式1.2.1 帧起始符68H:标识一帧信息的开始,其值为68H=01101000B。
1.2.2 地址域A0~A5:地址域由6个字节构成,每字节2位BCD码。
地址长度为12位十进制数,低地址位在先,高地址位在后。
当地址为999999999999H时,为广播地址。
1.2.3控制码C:控制码的格式如下所示。
D7=0:由主站发出的命令帧D7=1:由从站发出的应答帧D6=0:从站正确应答D6=1:从站对异常信息的应答D5=0:无后续数据帧D5=1:有后续数据帧D4~D0:请求及应答功能码00000:保留00001:读数据00010:读后续数据00011:重读数据00100:写数据01000:广播校时01010:写设备地址01100:更改串口通信速率01111:修改密码10000:最大需量清零11001:厂家保留11010:厂家保留1.2.4 数据长度L:L为数据域的字节数。
读数据时L≤200,写数据时L≤50,L=0 表示无数据域。
1.2.5 数据域DATA:数据域包括数据标识和数据、密码等,其结构随控制码的功能而改变。
传输时发送方按字节进行加33H处理,接收方按字节进行减33H处理。
1.2.6 校验码CS:从帧起始符开始到校验码之前的所有各字节的模256的和,即各字节二进制算术和,不计超过256的溢出值。
1.2.7结束符号16H:标识一帧信息的结束,其值为16H=00010110B。
校验码算法是一种用于验证数据传输是否正确的技术,通常用于网络通信和数据存储。
以下是校验码算法的主要步骤和示例:
1. 生成原始数据:首先,需要生成需要校验的原始数据,可以是任何类型的数据,如文本、图像、音频等。
2. 选择校验算法:根据需要和实际情况选择适当的校验算法,如奇偶校验(parity check)、海明校验(Hamming code)、循环冗余校验(CRC)等。
3. 添加校验位:根据选择的校验算法,将校验位添加到原始数据中。
校验位是额外添加的位,用于表示原始数据中的某些位,以便在接收端进行错误检测和纠正。
4. 发送数据和校验位:将原始数据和校验位一起发送到接收端。
5. 接收数据和校验位:接收端接收到数据和校验位后,使用相同的校验算法对数据进行校验。
6. 检测错误:根据校验算法的规则,检测是否存在错误。
如果存在错误,可以根据算法的规则进行纠正。
7. 返回结果:如果没有检测到错误,则返回“校验通过”,否则返回“校验不通过”。
下面是一个简单的例子,使用奇偶校验算法对一个字节进行错误检测和纠正:
1. 原始数据:01100101(8个位)
2. 选择奇偶校验算法:将每个位的值加起来,使得结果为偶数。
如果结果为奇数,则将最高位设为1。
3. 添加校验位:因为原始数据的二进制表示中有四个1,所以需要添加一个校验位,使得所有位的值为奇数或偶数。
因此,将最高位设为1,得到新的数据:10100101。
4. 发送数据和校验位:将新的数据(包括校验位)发送到接收端。
5. 接收数据和校验位:接收端接收到数据后。
CRC校验计算⽅法1、循环校验码(CRC码):是数据通信领域中最常⽤的⼀种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。
2、⽣成CRC码的基本原理:任意⼀个由⼆进制位串组成的代码都可以和⼀个系数仅为‘0’和‘1’取值的多项式⼀⼀对应。
例如:代码1010111对应的多项式为x6+x4+x2+x+1,⽽多项式为x5+x3+x2+x+1对应的代码101111。
3、CRC码集选择的原则:若设码字长度为N,信息字段为K位,校验字段为R位(N=K+R),则对于CRC码集中的任⼀码字,存在且仅存在⼀个R次多项式g(x),使得V(x)=A(x)g(x)=x R m(x)+r(x);其中: m(x)为K次信息多项式, r(x)为R-1次校验多项式,g(x)称为⽣成多项式:g(x)=g0+g1x+g2x2+...+g(R-1)x(R-1)+g R x R发送⽅通过指定的g(x)产⽣CRC码字,接收⽅则通过该g(x)来验证收到的CRC码字。
标准CRC⽣成多项式如下表:名称⽣成多项式简记式* 标准引⽤CRC-4 x4+x+1 3 ITU G.704CRC-8 x8+x5+x4+1 0x31CRC-8 x8+x2+x1+1 0x07CRC-8 x8+x6+x4+x3+x2+x1 0x5ECRC-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 SCTP基本算法(⼈⼯笔算):以CRC16-CCITT为例进⾏说明,CRC校验码为16位,⽣成多项式17位。
CRC校验计算方法1、循环校验码(CRC码):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。
2、生成CRC码的基本原理:任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。
例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。
3、CRC码集选择的原则:若设码字长度为N,信息字段为K位,校验字段为R位(N=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得V(x)=A(x)g(x)=x R m(x)+r(x);其中: m(x)为K次信息多项式, r(x)为R-1次校验多项式,g(x)称为生成多项式:g(x)=g0+g1x+g2x2+...+g(R-1)x(R-1)+g R x R发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC码字。
标准CRC生成多项式如下表:名称生成多项式简记式* 标准引用CRC-4 x4+x+1 3 ITU G.704CRC-8 x8+x5+x4+1 0x31CRC-8 x8+x2+x1+1 0x07CRC-8 x8+x6+x4+x3+x2+x1 0x5ECRC-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 SCTP基本算法(人工笔算):以CRC16-CCITT为例进行说明,CRC校验码为16位,生成多项式17位。
crc16校验码计算方法嘿,朋友们!今天咱来聊聊 CRC16 校验码的计算方法。
这玩意儿就像是给数据加上一把锁,确保数据的准确性呢!想象一下,数据就像一群要出门旅行的小伙伴,而 CRC16 校验码就是他们的旅行保险。
它能在数据传输的过程中,保驾护航,要是数据在路上出了啥问题,它就能及时发现。
那怎么计算这个神奇的校验码呢?首先,得有一个多项式,这就好比是旅行的路线图。
然后,把要校验的数据当成是小伙伴们要带的行李。
具体操作起来呢,就是把数据按照一定的规则进行处理。
这可不是简单的加减乘除哦,这里面可有大学问呢!就像是做菜,各种调料得搭配得恰到好处,才能做出美味佳肴。
比如说,先把数据进行移位啦,再和多项式进行运算啦。
这过程就像是在玩一个复杂的拼图游戏,每一步都得小心翼翼,不能出错。
CRC16 校验码的计算过程虽然有点复杂,但只要咱静下心来,一步一步地来,肯定能搞明白。
你想啊,要是没有它,数据在传输过程中出了错,那可就麻烦大了,就好比小伙伴们在旅行中丢了重要的行李。
而且,学会了计算 CRC16 校验码,那感觉可真棒!就像是掌握了一门神秘的技能,能让数据乖乖听话。
以后遇到数据传输的问题,咱就能胸有成竹地说:“嘿,这我会!”在实际应用中,CRC16 校验码可是大有用处呢。
无论是网络通信,还是各种电子设备,都离不开它的守护。
它就像是一个默默无闻的卫士,在背后默默地工作,确保一切都能顺利进行。
所以啊,朋友们,别被它复杂的外表吓倒,勇敢地去探索吧!相信我,一旦你掌握了它,你会发现它其实也没那么难嘛!加油哦,让我们一起成为 CRC16 校验码计算的小能手!怎么样,是不是觉得挺有意思的呀?快去试试吧!。
校验码巧解之完整版摘要作为几大热门专业之一,计算机考研的人数越来越多,但是关于校验码这方面的计算总是困扰着历届学员,同时这方面的知识不光在组成原理里面出现,在网络里面也涉及到。
所以本论文认真总结了校验码(奇偶校验码、海明码、循环冗余检验码)计算的详细过程,希望能帮各位学员或初学者解决这方面困扰。
关键词解决;计算机;校验码;计算1相关背景介绍1.1海明码:(Hanming)1)海明码的用途:在计算机计算过程中,由于种种原因致使数据在存储过程中出现差错。
为了能及时发现错误并及时纠正错误,通常可将原数据配成海明码。
2)海明码的引入:海明码是由Richard Hanming于1950年提出的,它具有一位纠错能力。
由纠错编码理论得知,任何一种编码是否具有检错能力和纠错能力,都与编码的最小距离有关。
所谓编码最小距离,是指编码系统中,任意两组合法代码之间的最小二进制位数的差异。
根据纠错理论得:L-1=D+C 且D>=C即编码的最小距离L越大,则其检测错误的位数越多、纠正错误的位数也越多,且纠错能力恒小于等于检错能力。
1.2循环冗余校验码:(Cyclic Redundancy Check)引入:磁表面存储器由于磁介质表面的缺陷、尘埃等原因,致使出现许多个错误位,循环冗余检验码可以发现和纠错数据在存储或传送过程中出现的多位错误代码,因此CRC码在磁介质存储器和计算机通信方面得到广泛应用。
2例子精讲2.1设置一个信息流的海明码2.1.1题目设计:分别按“配偶原则”和“配奇原则”设置信息码1100101的海明校验码,要求能指出和纠正一位错。
【解析】1)确定海明码的校验位的位数:设r为校验位的位数,则整个码字的位数应满足不等式:2r>=k+r+1,其中k为信息位数,这里k=7,所以可计算出r>=4,所以至少需要4位校验位。
2)确定校验位的位置:用位号(1-11)为2的权值的那些位,即20,21,22,23的位置作为校验位,分别记作P1,P2,P3,P4,余下的位有效信息位。
CRC校验算法CRC(Cyclic Redundancy Check)循环冗余校验是常用的数据校验方法,讲CRC 算法的文章很多,之所以还要写这篇,是想换一个方法介绍CRC算法,希望能让大家更容易理解CRC算法。
先说说什么是数据校验。
数据在传输过程(比如通过网线在两台计算机间传文件)中,由于传输信道的原因,可能会有误码现象(比如说发送数字5但接收方收到的却是6),如何发现误码呢?方法是发送额外的数据让接收方校验是否正确,这就是数据校验。
最容易想到的校验方法是和校验,就是将传送的数据(按字节方式)加起来计算出数据的总和,并将总和传给接收方,接收方收到数据后也计算总和,并与收到的总和比较看是否相同。
如果传输中出现误码,那么总和一般不会相同,从而知道有误码产生,可以让发送方再发送一遍数据。
CRC校验也是添加额外数据做为校验码,这就是CRC校验码,那么CRC校验码是如何得到的呢?非常简单,CRC校验码就是将数据除以某个固定的数(比如ANSI-CRC16中,这个数是0x18005),所得到的余数就是CRC校验码。
那这里就有一个问题,我们传送的是一串字节数据,而不是一个数据,怎么将一串数字变成一个数据呢?这也很简单,比如说2个字节B1,B2,那么对应的数就是(B1<<8)+B2;如果是3个字节B1,B2,B3,那么对应的数就是((B1<<16)+(B2<<8)+B3),比如数字是0x01,0x02,0x03,那么对应的数字就是0x10203;依次类推。
如果字节数很多,那么对应的数就非常非常大,不过幸好CRC只需要得到余数,而不需要得到商。
从上面介绍的原理我们可以大致知道CRC校验的准确率,在CRC8中出现了误码但没发现的概率是1/256,CRC16的概率是1/65536,而CRC32的概率则是1/2^32,那已经是非常小了,所以一般在数据不多的情况下用CRC16校验就可以了,而在整个文件的校验中一般用CRC32校验。
校验码的计算方法(1)
1.代码位置序号
代码位置序号是指包括校验码在内的,由右至左的顺序号(校验码的代码位置序号为1)。
2.计算步骤
校验码的计算步骤如下:
a.从代码位置序号2开始,所有偶数位的数字代码求和。
b.将步骤a的和乘以3。
c.从代码位置序号3开始,所有奇数位的数字代码求和。
d.将步骤b与步骤c的结果相加。
e.用大于或等于步骤d所得结果且为10最小整数倍的数减去步骤d所得结果,其差即为所求校验码
的值。
示例:代码690123456789X1校验码的计算见表B.1。
表1 校验码的计算方法
校验码的计算方法(2)
校验码值等于前面所有字节之和的低字节部分
例如:0x68 0x10 0x68 0x68 0x68 0x68 0x68 0x68 0x68。
循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码又叫(N,K)码。
对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。
根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。
校验码的具体生成过程为:假设发送信息用信息多项式C(X)表示,将C(x)左移R位,则可表示成C(x)*2的R次方,这样C(x)的右边就会空出R位,这就是校验码的位置。
通过C(x)*2的R次方除以生成多项式G(x)得到的余数就是校验码。
编辑本段几个基本概念1、多项式与二进制数码多项式和二进制数有直接对应关系:x的最高幂次对应二进制数的最高位,以下各位对应多项式的各幂次,有此幂次项对应1,无此幂次项对应0。
可以看出:x的最高幂次为R,转换成对应的二进制数有R+1位。
多项式包括生成多项式G(x)和信息多项式C(x)。
如生成多项式为G(x)=x^4+x^3+x+1,可转换为二进制数码11011。
而发送信息位 1111,可转换为数据多项式为C(x)=x^3+x^2+x+1。
2、生成多项式是接受方和发送方的一个约定,也就是一个二进制数,在整个传输过程中,这个数始终保持不变。
在发送方,利用生成多项式对信息多项式做模2除生成校验码。
在接受方利用生成多项式对收到的编码多项式做模2除检测和确定错误位置。
应满足以下条件:a、生成多项式的最高位和最低位必须为1。
b、当被传送信息(CRC码)任何一位发生错误时,被生成多项式做除后应该使余数不为0。
c、不同位发生错误时,应该使余数不同。
d、对余数继续做除,应使余数循环。
3 CRC码的生成步骤1、将x的最高次幂为R的生成多项式G(x)转换成对应的R+1位二进制数。
2、将信息码左移R位,相当与对应的信息多项式C(x)*2的R次方。
3、用生成多项式(二进制数)对信息码做除,得到R位的余数。
4、将余数拼到信息码左移后空出的位置,得到完整的CRC码。
各种条码的校验码算法(EAN13,COD128,GTIN,UCC等)校验码是由编码⽅案决定的,所以在代码中是否使⽤校验码和条码基本⽆关,但商品条码除外。
今天给⼤家介绍⼏种校验码的计算⽅法。
⼀、商品条码:商品条码中需要计算校验码的有:EAN-8(8位),EAN-13(13位),UCC(UPC-A)(12位),GTIN-14(ITF-14)(14位),GLN(13位),SSCC(18位)等。
它们虽然位数不同,但计算校验码的⽅法完全相同。
1、包含校验码的所有数字从右向左编号,分别为1,2,3......18位;2、从第2位开始,所有偶数位的权数为3,从第3位开始,所有奇数位的权数为1;3、将对应位置的代码数字与权数相乘,参见下图(以SSCC的18位数字为例);4、将所有乘积相加求和;(结果为109)5、对第4步的和,求MOD 10运算(将和109除以10,取其余数9);6、如果余数为0,则校验码为0,否则,⽤10减去余数的差即为校验码。
(上例中校验码为1)⼆、⾝份证校验码:⾝份证校验码的计算⽐较复杂⼀些,参见下图:1、⾃右向左为⾝份证号编号1-18;2、确定各位数的权数,权数的计算公式为 2^(i-1) mod 11i—位数如第3位的权数为2^(3-1)=2^2=4, 4除以11,商0余4,则权数为4。
再如第5位的权数为2^(5-1)=2^4=16,16除以11,商1余5,则权数为5。
3、将权数与对应的⾝份证号数字相乘;4、将所有乘积相加求和;(⽰例中的184)5、将第4步的结果除以11,求余数(⽰例中的8)6、从下表的R值中找到第5步的结果,对应的C值即为校验码。
(⽰例中8对应的是4)三、CODE-128码的校验符:CODE-128码的校验符不会出现在数据中,也不⽤读出,这⾥仅介绍⼀下计算⽅法,实际使⽤中都是由条码软件⾃动⽣成的。
由于CODE-128码可以表⽰字母、符号、控制符,⽽这些字符不能直接参与计算,所以要为每个字符分配⼀个码值。
校验码计算方法范文校验码是一种用于检验数据传输中是否出现错误的方法。
它通过对数据进行特定的运算,生成一个额外的数字或字符,将其附加在数据后面发送,接收方再利用同样的运算方法对接收到的数据进行校验,如果生成的结果与校验码匹配,则说明数据传输无误。
校验码有多种计算方法,下面将介绍几种常见的校验码计算方法。
1.奇偶校验码:奇偶校验码是最简单的校验方法之一,适用于英文字符的传输。
校验方法是计算字符中所有字节的二进制位中1的个数是否为奇数。
如果是奇数,校验位就设置为0,如果是偶数,校验位就设置为1、接收方在接收到数据后,再进行统计,校验位是否与计算结果匹配,如果不匹配,则说明出现了错误。
2.校验和:校验和是将数据中的所有字节进行相加,并将结果取补码作为校验码。
发送方计算校验和后,将其附加在数据中一起发送,接收方将数据中的所有字节相加并取补码,如果计算结果与接收到的校验码一致,则说明数据传输无误。
3.CRC校验码:CRC校验码是一种比较常见的校验方法,广泛用于数据通信中。
计算CRC校验码需要用到一个多项式,称为生成多项式。
发送方在发送数据时,通过对数据与生成多项式进行模2除法运算,得到余数(也就是校验码),将其附加在数据中一起发送。
接收方在接收到数据后,再次对接收到的数据与生成多项式进行模2除法运算,如果余数为0,则说明数据传输无误。
否则,说明出现了错误。
4.哈希校验码:哈希校验码是一种基于哈希算法的校验方法。
发送方将数据通过哈希算法处理得到一个固定长度的哈希值,将其附加在数据后发送。
接收方在接收到数据后,同样通过哈希算法计算数据的哈希值,并与接收到的哈希值进行比较,如果两者一致,则说明数据传输无误。
以上是常见的几种校验码计算方法,根据不同的应用场景和传输需求,选择适合的校验方法可以确保数据传输的准确性和完整性。
值得注意的是,校验码可以检测出一部分错误,但不能检测出所有错误,因此在实际应用中,还需要结合其他的错误检测和纠正方法来提高传输的可靠性。
MSDS⾥的CAS编号是什么CAS NO.怎么写EINECS是什么CAS Registry Number或称CAS Number ⼜称CAS登录号是美国化学⽂摘服务社(Chemical Abstracts Service ,CAS)为化学物质制订的登记号,该号是检索有多个名称的化学物质信息的重要⼯具。
是某种物质(化合物、⾼分⼦材料、⽣物序列(Biological sequences)、混合物或合⾦的8唯⼀的数字识别号码。
美国化学会的下设组织CAS负责为每⼀种出现在⽂献中的物质分配⼀个CAS号,其⽬的是为了避免化学物质有多种名称的⿇烦,使数据库的检索更为⽅便。
如今⼏乎所有的化学数据库都允许⽤CAS号检索。
到2005年12⽉25⽇,CAS已经登记了27,115,156种物质最新数据,并且还以每天4,000余种的速度增加。
格式:⼀个CAS号以连字符“-”分为三部分,第⼀部分有2到6位数字,第⼆部分有2 位数字,第三部分有1位数字作为校验码。
CAS号以升序排列且没有任何内在含义。
校验码的计算⽅法如下:CAS顺序号(第⼀、⼆部分数字)的最后⼀位乘以1,最后第⼆位乘以2,依此类推,然后再把所有的乘积相加,再把和除以10,其余数就是第三部分的校验码。
举例来说,⽔(H2O)的CAS号前两部分是7732-18,则其校验码=(8×1+1×2+2×3+3×4+7×5+7×6)mod 10=105 mod 10=5。
(mod是求余运算符)异构体、酶和混合物:不同的同分异构体分⼦有不同的CAS号,⽐如右旋葡萄糖(D-glucos)的CAS号是50-99-7,左旋葡萄糖(L-glucose)是921-60-8,α右旋葡萄糖(α-D-glucose)是26655-34-5。
偶然也有⼀类分⼦⽤⼀个CAS号,⽐如⼀组⼄醇脱氢酶(Alcohol dehydrogenase)的CAS号都是9031-72-5。
该通信规约适用于本地系统中多功能表的费率装置与手持单元(HHU)或其它数据终端设备进行点对点的或一主多从的数据交换方式,规定了它们之间的物理连接、通信链路及应用技术规范。
该协议在做“电力监控”、“水监控”等“工控领域”,具有广泛的应用。
协议具体内容可以从网上Google,下面主要介绍下协议的解析方法。
DL645协议需要先发送“前导字节”,用来唤醒从站,当然有些设备是不需要这样唤醒的。
在发送帧信息之前,先发送1-4个字节FEH,以唤醒接收方("FEH",H表示16进制,是一个字节), “前导字节” + “取数据报文”=“整体报文”。
首先我们先整体了解一个发送报文“68 12 34 56 78 90 12 68 01 02 43 C3 cs 16”在这之前呢,先看一下BCD码。
BCD码:二进制编码的十进制代码。
比如:0=00001=00012=00103=00114=01005=01016=01107=01118=10009=1001BCD码:ASCII表示(都是字符)BCD码都是由0~9,10个字符构成。
也就是说,BCD码一个字节是两位,一位是0~9,一个字节能够表示00~99。
BCD码1位是2进制的4位。
按16进制表示,没有ABCDEF。
帧格式(DL/T645-1997通讯规约标准文档中)帧是传送信息的基本单元。
帧格式如图所示。
4.2.1 帧起始符68H:标识一帧信息的开始,其值为68H=01101000B。
4.2.2地址域A0∽A5:地址域由6个字节构成,每字节2位BCD码。
地址长度为12位十进制数,可以为表号、资产号、用户号、设备号等。
具体使用可由用户自行决定。
当使用的地址码长度不足6字节时,用十六进制AAH补足6字节。
低地址位在先,高地址位在后。
当地址为999999999999H时,为广播地址。
4.2.3 控制码C:控制码的格式如下所示。
功能码后续帧标志从站异常标志传送方向D7=0:由主站发出的命令帧D7=1:由从站发出的应答帧D6=0:从站正确应答D6=1:从站对异常信息的应答D5=0:无后续数据帧D5=1:有后续数据帧D4∽D0:请求及应答功能码00000:保留00001:读数据00010:读后续数据00011:重读数据00100:写数据01000:广播校时01010:写设备地址01100:更改通信速率01111:修改密码10000:最大需量清零4.2.4 数据长度L:L为数据域的字节数。
水表通信协议V2.2(DZ)综述此协议是基于188 协议进行整理的,适用于一般远传水表。
传输时波特率为2400bps、偶校验、数据位为8 位、停止位为1 位。
同一帧数据中无特殊说明时一般为低字节在前,高字节在后。
1-4 0XFE帧起始符68H:标识一帧信息的开始,其值为68H=01101000B。
仪表类型T 在此协议中全固定为10H, 表示水表。
地址域A0---A6 地址域(A0--A6) 由7字节BCD码组成。
低在前, 高在后控制码C 控制码D7=0:由主站发出的命令帧D7=1:由从站发出的应答帧D6=0:从站正确应答D6=1:从站对异常信息的应答D5~D0:000001:读数据000100:写数据000011:读地址( 表号)010101:写地址( 表号)1XXXXX厂: 商自定义.其他: 暂保留未用数据长度L:L 为数据域的字节数。
L=0 表示无数据域。
数据域DATA:数据域包括数据标识、序列号和数据等,其结构随控制码的功能而改变。
校验码CS:从帧起始符开始到校验码之前的所有各字节的模256 的和,即各字节二进制算术和,不计超过256 的溢出值。
结束符16H:标识一帧信息的结束,其值为16H=00010110B协议帧控制码:C=CTR_1数据长度:L=03H+m(数据长度)数据标识: DI0,DI1; 序列号: SER2.1.3从站异常应答帧功能:从站收到非法的数据请求或无此数据控制码:C=CTR_2数据长度: L=03H序列号: SER帧格式:2.1.4 主站请求读控制字2.1.5 主站请求读数据标识说明3.1写数据3.1.1主站请求帧功能:请求读数据控制码:C=CTR_3数据长度:L=03H+m数(据域长度)数据标识: DI0,DI1;序列号: SER3.1.2控制码:C=CTR_4数据长度:L=03H+m(数据长度)数据标识: DI0,DI1; 序列号: SER3.1.3从站异常应答帧功能:从站收到非法的数据请求或无此数据控制码:C=CTR_5数据长度: L=03H序列号: SER帧格式:3.1.4 主站请求写控制字3.1.5 主站请求写数据标识说明4. 数据表达格式说明5. 单位代号表状态ST0定义表状态ST1定义表SER固定为00。
校验码的基础知识校验码是一种用于验证信息完整性和准确性的技术手段。
在计算机领域,校验码常常被用于数据传输和存储过程中,确保数据的准确无误。
本文将介绍校验码的基础知识,包括校验码的定义、常见的校验码算法和应用场景等。
一、校验码的定义校验码,即校验和码,是一种通过对数据进行运算得到的一段二进制码。
它可以用于检测和校正数据传输或存储中的错误。
校验码的计算方式通常基于数据的位操作,通过对数据进行一系列的运算,得到一个固定长度的校验码值。
这个校验码值可以在数据传输或存储过程中与原始数据一起传输或存储,接收方在接收到数据后再次计算校验码,并与接收到的校验码进行比较,以验证数据的完整性和准确性。
二、常见的校验码算法1. 奇偶校验:奇偶校验是最简单的一种校验码算法,它通过统计数据中二进制位中1的个数,来判断数据中是否存在错误。
如果数据中1的个数为偶数,则校验位为0;如果数据中1的个数为奇数,则校验位为1。
奇偶校验只能检测出奇数个错误位,无法检测出偶数个错误位。
2. 校验和:校验和是一种常用的校验码算法,它通过将数据划分为若干个字节或字,并对每个字节进行加法运算,得到最终的校验和值。
接收方在接收到数据后再次计算校验和,如果计算得到的校验和与接收到的校验和一致,则数据传输正确,否则存在错误。
3. 循环冗余校验(CRC):CRC是一种广泛应用于数据传输和存储过程中的校验码算法。
它通过对数据进行多项式除法来计算校验码。
CRC算法具有良好的错误检测和纠正能力,常用于网络通信、存储系统等领域。
三、校验码的应用场景1. 数据传输:在数据传输过程中,校验码可以用于验证数据的完整性和准确性。
发送方在发送数据前计算校验码,并将校验码与数据一起发送给接收方。
接收方在接收到数据后再次计算校验码,通过比较计算得到的校验码与接收到的校验码,可以判断数据是否传输正确。
2. 数据存储:在数据存储过程中,校验码可以用于验证数据的完整性。
通过计算数据的校验码,并将校验码与数据一起存储,可以在读取数据时进行校验,以确保数据的准确无误。
常见⼏种校验⽅法(CS和校验、CRC16、CRC32、BCC异或校验)总结⼀些通讯协议中常⽤到的⼏种校验⽅法:1.CS和校验(如:标准188协议校验⽅式)///<summary>/// CS和校验///</summary>///<param name="Abyte"></param>///<returns></returns>public static byte Check_CS(byte[] Abyte){byte result = new byte();try{int num = 0;for (int i = 0; i < Abyte.Length; i++){num = (num + Abyte[i]) % 256;}result = (byte)num;}catch{result = 0;}return result;}2.CRC16校验CRC16校验的⽅式⽐较多(如下图)我这⾥⽤到了2种,具体对应那个闹不清了【捂脸】,下⽅附上CRC校验⼯具有需要的可以⾃⼰尝试下。
CRC校验⼯具:///<summary>/// CRC16校验函数 (⼀)///</summary>///<param name="x"></param>///<returns></returns>private static byte[] CRC16(byte[] x){byte[] temdata = new byte[2];int len = x.Length;UInt16 crc = 0;byte da;int i = 0;UInt16[] yu = { 0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef };while (len-- != 0){da = (byte)(((byte)(crc / 256)) / 16);crc <<= 4;crc ^= yu[da ^ x[i] / 16];da = (byte)(((byte)(crc / 256)) / 16);crc <<= 4;crc ^= yu[da ^ x[i] & 0x0f];i++;}temdata[1] = (byte)(crc & 0xFF);temdata[0] = (byte)(crc >> 8);return temdata;}///<summary>/// CRC16校验类 (⼆)///</summary>public static class Crc16{const ushort polynomial = 0xA001;static readonly ushort[] table = new ushort[256];///<summary>///获得校验字符串///</summary>///<param name="bytes"></param>///<returns></returns>public static string ComputeChecksum(byte[] bytes){ushort crc = 0;for (int i = 0; i < bytes.Length; ++i){byte index = (byte)(crc ^ bytes[i]);crc = (ushort)((crc >> 8) ^ table[index]);}return crc.ToString("X4");}static Crc16(){ushort value;ushort temp;for (ushort i = 0; i < table.Length; ++i){value = 0;temp = i;for (byte j = 0; j < 8; ++j){if (((value ^ temp) & 0x0001) != 0){value = (ushort)((value >> 1) ^ polynomial);}else{value >>= 1;}temp >>= 1;}table[i] = value;}}}3.CRC32校验private static UInt32[] crcTable = {0x0, 0x77073096, 0xee0e612c, 0x990951ba, 0x76dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,0xedb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x9b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,0x76dc4190, 0x1db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x6b6b51f, 0x9fbfe4a5, 0xe8b8d433,0x7807c9a2, 0xf00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x86d3d2d, 0x91646c97, 0xe6635c01,0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x3b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x4db2615, 0x73dc1683,0xe3630b12, 0x94643b84, 0xd6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0xa00ae27, 0x7d079eb1,0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x26d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x5005713,0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0xcb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0xbdbdf21,0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d, };///<summary>///获取CRC32校验字符串///</summary>///<param name="bytes"></param>///<returns>4字节16进制码</returns>public static string GetCRC32(byte[] bytes){int iCount = bytes.Length;UInt32 crc = 0xFFFFFFFF;for (int i = 0; i < iCount; i++){crc = ((crc >> 8) & 0x00FFFFFF) ^ crcTable[(crc ^ bytes[i]) & 0xFF];}UInt32 temp = crc ^ 0xFFFFFFFF;return temp.ToString("X8");}4.BCC异或校验///<summary>/// BCC异或取反校验///</summary>///<param name="data"></param>///<returns></returns>public static string getBCC(byte[] data){String ret = "";byte[] BCC = new byte[1];for (int i = 0; i < data.Length; i++){BCC[0] = (byte)(BCC[0] ^ data[i]);}String hex = ((~ BCC[0]) & 0xFF).ToString("X");//取反操作if (hex.Length == 1){hex = '0' + hex;}ret += hex.ToUpper();return ret;}。
C#校验算法列举以下是⼯作中常⽤的⼏种校验算法,后期将不断更新和校验///<summary>/// CS和校验///</summary>///<param name="bytesToCalc">要进⾏CS和校验的byte数组.</param>///<returns>System.Byte[].</returns>public static byte[] CsChecksum(byte[] bytesToCalc){int num = 0;for (int i = 0; i < bytesToCalc.Length; i++){num = (num + bytesToCalc[i]) % 0xffff;}//实际上num 这⾥已经是结果了,如果只是取int 可以直接返回了return BitConverter.GetBytes(num);}CRC16校验///<summary>///计算CRC16.///</summary>///<param name="frame">The frame.</param>///<param name="n0">The n0.</param>///<param name="n1">The n1.</param>///<param name="highFirst">设置为<c>true</c>⾼位在前.</param>///<returns>System.Byte[].</returns>private byte[] CRC16(byte[] frame, int n0, int n1, bool highFirst){ushort num = 65535;for (var i = n0; i < n0 + n1; i++){num ^= frame[i];for (var j = 0; j < 8; j++){var num2 = (ushort) (num & 1);num = (ushort) (num >> 1);if (num2 > 0)num ^= 40961;}}var acrc = new byte[2];if (highFirst){acrc[0] = (byte) ((num >> 8) & 0xFF); //⾼位acrc[1] = (byte) (num & 0xFF); //低位}else{acrc[0] = (byte) (num & 0xFF); //低位acrc[1] = (byte) ((num >> 8) & 0xFF); //⾼位}return acrc;}CRC32算法未进⾏测试转⾃///<summary>///计算给定长度数据的32位CRC///</summary>///<param name="data">要计算CRC的字节数组</param>///<returns>CRC值</returns>public static UInt32 GetCrc32(Byte[] data){UInt32 crcValue = 0xFFFFFFFF;if (data != null){foreach (Byte b in data){crcValue = (crcValue >> 8) ^ CRC32TABLE[(crcValue ^ b) & 0xFF];}}return ~crcValue;}private static readonly UInt32[] CRC32TABLE ={0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D};}。
cs校验码计算方法
CS校验码是一种用于验证数据完整性的校验码。
在计算CS校验码时,需要对数据进行异或运算,并将结果转换为十六进制数。
具体计算方法如下:
1. 将要计算CS校验码的数据按字节进行异或运算,得到一个字节的结果。
2. 将得到的字节结果与下一个字节进行异或运算,直到最后一个字节。
3. 将最终得到的结果转换为十六进制数,即为CS校验码。
例如,对于以下数据进行CS校验码计算:
0x01 0x02 0x03 0x04
1. 对0x01和0x02进行异或运算,得到结果0x03。
2. 对0x03和0x03进行异或运算,得到结果0x00。
3. 对0x00和0x04进行异或运算,得到结果0x04。
4. 将0x04转换为十六进制数,得到CS校验码为0x04。
因此,该数据的CS校验码为0x04。
通过计算CS校验码,可以有效地检测数据在传输过程中是否被篡改或损坏。
- 1 -。