打印

checksum 如何计算?

[复制链接]
13011|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楼这位兄弟!!

使用特权

评论回复
5
宇航3000|  楼主 | 2011-3-23 11:37 | 只看该作者
但是还有个问题就是如果所有加起来之和超过了0xFF怎么办呢?

使用特权

评论回复
6
johnwjl| | 2011-3-23 15:12 | 只看该作者
取低8位。

使用特权

评论回复
7
xieyx77| | 2011-3-23 17:34 | 只看该作者
checksum 一般是个unsigned char型,6楼也是正解。

使用特权

评论回复
8
xieyx77| | 2011-3-23 17:37 | 只看该作者
3# 刘前辈
3楼才是正解,我只是找规律来猜的。

使用特权

评论回复
9
宇航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

粉丝