Chinaunix首页 | 论坛 | 博客
  • 博客访问: 357517
  • 博文数量: 127
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 333
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-27 14:44
个人简介

兴趣是最好的学习契机!

文章分类

全部博文(127)

文章存档

2017年(1)

2016年(3)

2015年(54)

2014年(58)

2013年(11)

我的朋友

分类: C/C++

2014-08-14 17:58:19

校验和的计算方法  这是通信中都必须做的一件事,是一种协议。说简单点就是我把一包数据发给你,还多几个字节的校验值。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。
我们自己单片机的校验和:
发送端
26 00 00 ff ff ff 2a 3e 39 39 72 a6 3e c0 7f a6 3c 7f 5b 2d 95 7c 4a 05 01 02 04 01 02 07 02 01 01 05 01 03 48 b3 62
sum is 0xb56(上面这些数的和26+00+00+ff+...+b3+62)
Checksum is 0xf4a9(0xb56取反)
发送26 00 00 ff ff ff 2a 3e 39 39 72 a6 3e c0 7f a6 3c 7f 5b 2d 95 7c 4a 05 01 02 04 01 02 07 02 01 01 05 01 03 48 b3 62 a9 f4
接收端
26 00 00 ff ff ff 2a 3e 39 39 72 a6 3e c0 7f a6 3c 7f 5b 2d 95 7c 4a 05 01 02 04 01 02 07 02 01 01 05 01 03 48 b3 62 a9 f4
sum is 0xb56(上面这些数的和26+00+00+ff+...+b3+62不含后边两位)
sum+(f4<<8)+a9?=0xffff如果等于,则说明接收正确。

阅读(702) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~