校验和计算
- 格式:pdf
- 大小:556.77 KB
- 文档页数:4
校验和算法IP/ICMP/IGMP/TCP/UDP等协议的校验和算法都是相同的。
今儿以IP 数据包为例来讲解一下校验和算法。
在IP数据包发送端,首先将校验和字段置为0,然后将IP数据包头按16比特分成多个单元,如果包头长度不是16比特的倍数,则用0比特填充到16 比特的倍数,其次对各个单元采用反码加法运算(即高位溢出位会加到低位,通常的补码运算是直接丢掉溢出的高位),将得到的和的反码填入校验和字段,最后发送数据。
在IP数据包接收端, 首先将IP包头按16比特分成多个单元,如果包头长度不是16比特的倍数,则用0比特填充到16比特的倍数,其次对各个单元采用反码加法运算,检查得到的和是否符合全是1(有的实现可能对得到的和取反码,然后判断最终的值是否为0),如果符合全是1(取反码后是0),则进行数据包的下一步处理,如果不符合,则丢弃该数据包。
在这里大家要注意,反码和是采用高位溢出加到低位上。
接下来以一张从网上找的一张IP数据包头图片来加以说明以上的算法。
大家应该记得一个公式,即两数据的反码和等于两数据和的反码,把它推广到n个数据同样适用,公式:~[X]+~[Y]=~[X+Y]从这张图片可以看出它的校验和是0x618D,现在我们来用它来模拟我们的发送端和接收端。
发送端:步骤如下:首先,将checksum字段设为0,那么将得到IP数据包头的分段信息如下1. 0x45002. 0x00293. 0x44F14. 0x40005. 0x80066. 0x0000 ------->这个为Header Checksum的值,我们前面将其重置为0了7. 0xC0A88. 0x01AE9. 0x4A7D+10. 0x477D结果为:0x29E70注意要将溢出位加到低位,即0x29E70的溢出位为高位2,将它加到低位上,即0x9E70+0x2=0x9E720x9E72二进制为:1001 1110 0111 0010反码为:0110 0001 1000 11010110 0001 1000 1101的16进制为:0x618D(这就是我们的校验和) 接收端:当我们收到该数据包时,它的分段信息将是如下信息:1. 0x45002. 0x00293. 0x44F14. 0x40005. 0x80066. 0x618D ------->这个为Header Checksum的值7. 0xC0A88. 0x01AE9. 0x4A7D+10. 0x477D结果为:0x2FFFD该数值的溢出位为高位2,把它加到底位D上,即0xFFFD+0x2=0xFFFF 0xFFFF二进制为:1111 1111 1111 11111111 1111 1111 1111反码为:0。
串口校验码计算公式
串口校验码计算公式根据所选用的校验方式不同而不同。
常见的校验方式有奇偶校验、偶校验和无校验(即无需计算校验码)。
以下分别介绍这三种校验方式的计算公式:
1. 奇偶校验:将数据位的值相加,并将进位(如果有)加到结果中。
如果结果是偶数,则校验位为0,否则为1。
例如,要发送的数据为01100101,其奇偶校验位的计算过程
如下:
0 + 1 + 1 + 0 + 0 + 1 + 0 + 1 = 4,因为4是偶数,所以奇偶校验位为0。
因此,最终要发送的数据为011001010。
2. 偶校验:与奇偶校验相同,只是最终结果恰好相反,即如果结果是偶数,则校验位为1,否则为0。
以要发送的数据为01100101为例,偶校验位的计算过程如下:
0 + 1 + 1 + 0 + 0 + 1 + 0 + 1 = 4,因为4是偶数,所以偶校验位为1。
因此,最终要发送的数据为011001011。
3. 无校验:在串口通信中,如果不需要进行校验,直接将数据
发送即可。
综上所述,串口校验码计算公式要根据所选用的校验方式进行相应的计算。
如果使用奇偶校验或偶校验,需要将数据位的值累加并判断结果的奇偶性,得出最终的校验位;如果使用无校验,则无需计算校验码。
校验和的计算方法
这是通讯中都一定做的一件事,是一种协议。
说简单点就是我把一包数据
发给你,还多几个字节的校验值。
sum,CRC,这些都是算法,算法是收发两头
预先商定好的。
所以你算的结果假如和刚收到的校验值同样,就说明那个包全
部收对。
并告诉对面接着发下一个包包,假如不一致,那就告诉对面,方才的包重
发,假如重发的次数超出你们设定的最大值,那就宣布连结失败。
皆这样类..
ip 头的用下边的步骤解说这个例子,为何校验和为2f01:
实质接收数据( ip 数据帧头) 45 00 00 30 4a 3e 40 00 80 06 2f 01 c0 a8 00 37 c0 a8 00 01
****************
为了计算一份数据报的ip 校验和,第一把查验和字段置为0。
而后,对其
中的每个 16bit 进行二进制反码乞降,结果存在查验和字段中。
当收到一份 ip 数
据报后,同时对首部中每个 16bit 进行二进制反码的乞降。
因为接收方在计算过程中包括了发送方存在首部中的查验和,所以,假如
首部在传输过程中没有发生任何差错,那么接收方计算的结果应当为全
1.
1 / 1。
串口通信crc校验计算
在串口通信中,CRC(循环冗余校验)是一种常用的校验方法,用于检测数据传输过程中的错误。
下面是一个简单的CRC校验计算示例,使用的是CRC-16(也称为Xmodem CRC)算法。
假设我们要发送的数据是 0x55 0x44 0x33 0x22,我们可以按照以下步骤计算CRC校验值:
1. 确定生成多项式。
在CRC-16中,常用的生成多项式是 0x1021(二进制表示为 1000000000000010000000001)。
2. 将数据左移16位,与生成多项式进行异或操作。
在本例中,数据左移后的结果为 0x55443322'00000000。
3. 将异或操作的结果与生成多项式进行模2除法,得到余数。
在本例中,余数为 0x243F(二进制表示为 1001010001111111)。
4. 将余数左移16位,与原数据拼接起来,得到CRC校验码。
在本例中,CRC校验码为 0x55443322'243F。
以上是一个简单的CRC校验计算示例,实际应用中可能需要根据具体的协议和数据进行调整。
crc校验值计算
摘要:
1.CRC 校验值的概念
2.CRC 校验值的计算方法
3.CRC 校验值的应用
正文:
CRC(Cyclic Redundancy Check,循环冗余校验)是一种广泛应用于数据传输和存储的错误检测技术。
通过在数据末尾附加一些校验位,然后接收方在接收到数据后,通过相同的计算方法,对数据进行校验,以判断数据在传输过程中是否发生了改变或错误。
CRC 校验值的计算方法主要基于二进制多项式。
发送方和接收方都需要预先约定一个二进制多项式,通常被称为生成多项式。
发送方首先将待发送的数据用二进制表示,并在其后面添加一些零,使其长度满足一定的要求。
然后,发送方使用生成多项式去除这个二进制数,得到的余数就是CRC 校验值。
接收方收到数据后,也对数据进行同样的计算,得到的余数如果与接收到的CRC 校验值相同,则认为数据正确,否则认为数据出错。
CRC 校验值的应用主要体现在数据传输和存储的错误检测和纠正。
在数据传输中,CRC 校验值可以有效地检测数据是否在传输过程中发生了改变或错误。
在数据存储中,CRC 校验值可以作为数据的一种保护机制,防止数据在存储过程中发生意外的改变或错误。
校验和快速计算⽅法先将代码贴上1 uint16_t cal_checksum(uint32_t *pstart,uint16_t len)2 {3 uint64_t checksum;4 uint32_t *pend;5 uint32_t v0,v1,v2,v3,v4;6 checksum = 0;7 pend = (uint32_t*)((char*)pstart + (len & (~0xF)));8while(pstart < pend)9 {10 v0 = *pstart;11 v1 = *(pstart+1);12 v2 = *(pstart+2);13 v3 = *(pstart+3);1415 checksum += v0;16 checksum += v1;17 checksum += v2;18 checksum += v3;1920 pstart += 4;21 }2223 len = len & 0xF;24 pend = (uint32_t*)((char*)pstart + (len & (0xF)));25while(pstart < pend)26 {27 v0 = (uint32_t)(*(uint16_t*)pstart);28 v1 = (uint32_t)(*((uint16_t*)pstart+1));2930 pstart += 1;3132 checksum += v0;33 checksum += v1;34 }3536switch(len & 0x3)37 {38case3:39 v0 = (uint32_t)(*(uint16_t*)pstart);40 v1 = ((uint32_t)(*((uint8_t*)pstart+2)) << 8);41 checksum += v0;42 checksum += v1;43break;44case2:45 v0 = (uint32_t)(*(uint16_t*)pstart);46 checksum += v0;47break;48case1:49 v0 = ((uint32_t)(*((uint8_t*)pstart+2)) << 8);50 checksum += v0;51default:52break;53 }5455 checksum = (checksum>>32) + (checksum&0xFFFFFFFF);56 checksum = (checksum>>32) + (checksum&0xFFFFFFFF);57 checksum = (checksum>>16) + (checksum&0xFFFF);58 checksum = (checksum>>16) + (checksum&0xFFFF);5960return checksum ^ 0xFFFF;61 }RFC规定的checksum的计算⽅法是对每两个字节当做⼀个数进⾏计算,出现进位则加到低位上。
485校验位计算规则校验位是一种用于错误检测的技术,可以用来验证数据传输或存储中的错误。
485校验位计算规则是指在RS-485通信协议中,计算校验位的具体方法和规定。
RS-485是一种常用的串行通信协议,用于在远程设备之间进行数据传输。
它可以支持多个设备同时使用同一条数据线进行通信,比如在工业自动化控制系统中常使用的485总线。
为了确保数据传输的准确性和可靠性,采用了校验位这种错误检测技术。
在485通信协议中,常用的校验位计算规则有以下几种:1. 奇偶校验位(Parity bit):将数据中的所有位相加,得到结果的二进制表示。
如果结果中的1的个数是奇数,校验位则为1;如果为偶数,校验位为0。
2. 奇校验位(Odd parity):将数据中的所有位相加,得到结果的二进制表示。
如果结果中的1的个数是奇数,则校验位为0;如果是偶数,则校验位为13. 偶校验位(Even parity):将数据中的所有位相加,得到结果的二进制表示。
如果结果中的1的个数是奇数,则校验位为1;如果是偶数,则校验位为0。
通过奇偶校验位的计算,可以检测出数据帧中的一位错误。
如果在传输过程中数据位发生了错误,接收方在进行奇偶校验时,会发现校验位和数据位的奇偶性不一致,从而判定数据帧有错误。
需要注意的是,奇偶校验位只能检测出奇数个错误,而不能检测出偶数个错误。
因此,在实际应用中,为了提高错误检测的可靠性,通常会采用更为复杂且安全性更高的校验方式,比如循环冗余检验(CRC)。
循环冗余检验是一种更为高级的校验方式,通过对数据进行特定的计算和异或运算,生成一个校验码。
接收方在接收到数据帧后,同样通过相同的计算和异或运算,得到校验码。
通过比较接收到的校验码和计算得到的校验码是否一致,可以判断数据帧是否有错误。
总的来说,485校验位计算规则是用于对数据帧进行错误检测的技术。
通过计算校验位,可以判断数据帧在传输过程中是否发生了错误。
不同的计算规则可以提供不同的错误检测能力,可以根据具体的应用需求选择适合的校验方式。
校验和表示方法校验和是计算机网络中常用的一种数据校验方法,用于检测数据的完整性和准确性。
在网络通信中,由于数据传输过程中存在各种干扰和错误,为了保证数据的正确传输,通常需要使用校验和进行验证。
校验和的计算方法有很多种,常见的有累加和校验、异或校验和和循环冗余校验(CRC)等。
其中,累加和校验是一种简单而常用的校验和计算方法。
它的原理是将数据中的每个字节相加,然后取结果的低字节作为校验和。
接收方在接收到数据后,同样将数据中的每个字节相加,并与发送方传输的校验和进行比较,如果两者相等,则说明数据传输没有出现错误。
异或校验和是另一种常用的校验和计算方法。
它的原理是将数据中的每个字节依次进行异或运算,得到的结果即为校验和。
发送方在发送数据时,将数据和校验和一起发送给接收方。
接收方在接收到数据后,同样对数据中的每个字节进行异或运算,并与接收到的校验和进行比较,如果两者相等,则说明数据传输没有出现错误。
循环冗余校验(CRC)是一种更为复杂的校验和计算方法。
它的原理是将数据看作一个多项式,并通过对多项式进行除法运算得到余数,余数即为校验和。
CRC校验和的优点是可以检测出更多的错误,但计算复杂度较高。
校验和主要用于检测数据在传输过程中是否发生了错误。
在发送方,数据经过计算得到校验和后,将数据和校验和一起发送给接收方。
接收方在接收到数据后,同样进行校验和的计算,并与发送方传输的校验和进行比较。
如果两者相等,则说明数据没有发生错误,否则则说明数据传输存在错误。
校验和的使用可以有效地保证数据的完整性和准确性。
它可以用于各种网络通信协议中,如TCP/IP协议、以太网协议等。
在实际应用中,校验和通常被添加在数据包的头部或尾部,接收方在接收到数据包后,可以通过校验和来验证数据的正确性。
校验和虽然可以检测出一部分错误,但并不能完全保证数据的正确传输。
因此,在一些对数据传输可靠性要求较高的场合,还需要使用其他更为复杂的错误检测和纠正算法,如海明码、前向纠错码等。
NMEA 0183是一种标准协议,用于GPS和其他导航设备之间的数据交换。
NMEA句子由一系列由逗号分隔的字段组成,每个字段都包含特定的信息,如时间、日期、位置、速度等。
为了验证数据的完整性,NMEA句子还包含一个校验和字段。
校验和(Checksum)是一种用于验证数据完整性的方法,通过将数据中的每个字节相加,然后取总和的最低有效字节作为校验和。
如果接收的数据的校验和与计算出的校验和不匹配,则说明数据在传输过程中可能已损坏或被篡改。
NMEA校验和的计算方法如下:
1.将NMEA句子中的所有字符(包括问号)按ASCII码转换为二进制数。
2.将二进制数按照8位字节的形式分为若干段,每段包含8位二进制数。
3.将每段中的二进制数相加,得到一个字节的和。
4.取所有字节和中的最低有效字节作为校验和。
5.将校验和添加到NMEA句子的末尾,形成完整的NMEA数据包。
需要注意的是,不同的NMEA句子类型可能具有不同的字段结构和校验和计算方法。
因此,在实际使用中,应该根据具体的NMEA句子类型和协议规范进行校验和计算。
校验和算法转⾃经常看计算机⽹络相关的书时,每次看到关于IP或者是UDP报头校验和时,都是⼀笑⽽过,以为相当简单的东西,不就是16bit数据的相加吗!最近在学习Ping命令的源待时,看到⾥⾯有关于校验和的算法。
⼀头雾⽔,后来查找资料,看到校验和是16bit字的⼆进制反码和。
总是觉得很奇怪,为什么会⽤反码和,⽽不是直接求和呢?或者是补码和呢?因为在计算机⾥⾯数据是以补码的形式存在啊!经过看书查资料,下⾯总结⼀些这个校验和算法具体是怎么实现的。
⾸先,IP、ICMP、UDP和TCP报⽂头都有检验和字段,⼤⼩都是16bit,算法基本上也是⼀样的。
在发送数据时,为了计算数据包的检验和。
应该按如下步骤:1、把校验和字段设置为0;2、把需要校验的数据看成以16位为单位的数⼦组成,依次进⾏⼆进制反码求和;3、把得到的结果存⼊校验和字段中在接收数据时,计算数据包的检验和相对简单,按如下步骤:1、把⾸部看成以16位为单位的数字组成,依次进⾏⼆进制反码求和,包括校验和字段;2、检查计算出的校验和的结果是否为0;3、如果等于0,说明被整除,校验和正确。
否则,校验和就是错误的,协议栈要抛弃这个数据包。
虽然说上⾯四种报⽂的校验和算法⼀样,但是在作⽤范围存在不同:IP校验和只校验20字节的IP报头;⽽ICMP校验和覆盖整个报⽂(ICMP报头+ICMP数据);UDP和TCP校验和不仅覆盖整个报⽂,⽽且还有12个字节的IP伪⾸部,包括源IP地址(4字节)、⽬的IP地址(4字节)、协议(2字节)、TCP/UDP包长(2字节)。
另外UDP、TCP数据报的长度可以为奇数字节,所以在计算校验和时需要在最后增加填充字节0(填充字节只是为了计算校验和,可以不被传送)。
在UDO传输协议中,校验和是可选的,当校验和字段为0时,表明该UDP报⽂未使⽤校验和,接收⽅就不需要校验和检查了!那如果UDP 校验和的计算结果是0时怎么办?书上有⼀句话:“如果校验和的计算结果为0,则存⼊的值为全1(65535),这在⼆进制反码计算中是等效的”那么校验和到底怎么计算了?1、什么是⼆进制反码求和对⼀个⽆符号的数,先求其反码,然后从低位到⾼位,按位相加,有益处则向⾼位进1(和⼀般的⼆进制法则⼀样),若最⾼位有进位,则向最低位进1.⾸先这⾥的反反码好像和以前学的有符号反码不⼀样,这⾥不分正负数,直接每个为都取反。