checksum 如何计算?

[复制链接]
14120|8
 楼主| 宇航3000 发表于 2011-3-22 23:33 | 显示全部楼层 |阅读模式
我现在有个串口通讯,但是不知道checksum是怎么计算出来的 。
有两个列子:
0x55 0x04 0x00 0x38 0x00 0x01 0xC3     最后面的0XC3就是checksum
0x55 0x06 0x00 0x02 0x00 0x01 0x00 0x38 0xBF   最后面的0XBF就是checksum
0x55 0x0B 0x00 0x39 0x00 0x03 0x01 0x05 0x00 0x03 0x02 0x00 0x01 0xAD    最后面的0XAD就是checksum

其中0x55 是开始字节,不知算不算在内的,有谁知道这个checksum是怎么算出来的?
xieyx77 发表于 2011-3-22 23:51 | 显示全部楼层
本帖最后由 xieyx77 于 2011-3-22 23:52 编辑

~(0x04+0x00+0x38+0x00+0x01)+0x01 == 0xC3
~(0x06+0x00+0x02+0x00+0x01+0x00+0x38)+0x01 ==  0xBF
~(0x0B+0x00+0x39+0x00+0x03+0x01+0x05+ 0x00+0x03+0x02+0x00+0x01) + 0x01== 0xAD

评分

参与人数 1威望 +1 收起 理由
宇航3000 + 1 非常有帮助

查看全部评分

刘前辈 发表于 2011-3-23 09:26 | 显示全部楼层

checksum 等于累加和的负数,

本帖最后由 刘前辈 于 2011-3-23 09:36 编辑

楼上很细心。不过有点疑问,是求反加一容易,还是求负值容易?C语言当然写成负数形式。写成反码加一就不好理解。

“一个数的负数等于这个数的反码+1.”

所以:0x04+0x00+0x38+0x00+0x01=0x3d= - 0x3C;  // - 0x3d=3C;
后面不用证明了吧:
0x06+0x00+0x02+0x00+0x01+0x00+0x38=0x41= - 0xBF;

0x0B+0x00+0x39+0x00+0x03+0x01+0x05+ 0x00+0x03+0x02+0x00+0x01=0x53= - 0xAD;

/
 楼主| 宇航3000 发表于 2011-3-23 10:46 | 显示全部楼层
太谢谢各位了,尤其是2楼这位兄弟!!
 楼主| 宇航3000 发表于 2011-3-23 11:37 | 显示全部楼层
但是还有个问题就是如果所有加起来之和超过了0xFF怎么办呢?
johnwjl 发表于 2011-3-23 15:12 | 显示全部楼层
取低8位。
xieyx77 发表于 2011-3-23 17:34 | 显示全部楼层
checksum 一般是个unsigned char型,6楼也是正解。
xieyx77 发表于 2011-3-23 17:37 | 显示全部楼层
3# 刘前辈
3楼才是正解,我只是找规律来猜的。
 楼主| 宇航3000 发表于 2011-3-23 22:23 | 显示全部楼层
如果取低8位,下面的checksum就是:
0x0B 0x90 0x39 0xE0 0XAF
~(0x0B +0x90+ 0x39 +0xE0 +0XAF)+01=~(0x263 )+01 取低8位即:~(0x63)+01==0x9D
所以计算出的checksum是0X9D . 大家看看对不?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

165

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部