打印
[C语言]

请教一个累加和校验

[复制链接]
1657|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
banimashale|  楼主 | 2016-11-6 20:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
u8 Checksum (u8* Buffer, u8 DataNumber)
{
   u8 i=0;
   u16 temp1=0;
   u16 temp2=0;

   for(i=0;i<DataNumber;i++)
   {
     temp1 = temp1+ *Buffer;
     temp2 = temp1>>8;

     if( temp2> 0 )
     {
        temp1++;
        temp1&= ~0x0100;
     }
     Buffer++;
   }

   return (u8)(~temp1);
}

temp1++ 和 return (u8)(~temp1) 是否和补码有关,这种累加和校验叫什么?

相关帖子

沙发
airwill| | 2016-11-7 20:21 | 只看该作者
看这个校验和计算, 好象是在 LIN 总线里的校验算法.
return (u8)(~temp1);
就是返回校验和的补码

使用特权

评论回复
板凳
皈依| | 2016-11-8 11:59 | 只看该作者
本帖最后由 皈依 于 2016-11-8 12:01 编辑

temp1++;是根据temp2判断而来的,
tem1是u16, buff是u8, temp2是temp1的高8位,而temp1是buff的累加和,所以只有累加和溢出的时候对temp1进行值的改变。return (u8)(~temp1); 就是累加和取反 然后强制转换为u8,
其实这个校验和就是累加和的一种变种,最后再取了个反

使用特权

评论回复
地板
banimashale|  楼主 | 2016-11-8 19:16 | 只看该作者
airwill 发表于 2016-11-7 20:21
看这个校验和计算, 好象是在 LIN 总线里的校验算法.
return (u8)(~temp1);
就是返回校验和的补码 ...

确实是LIN总线校验,就是不知道为什么LIN总线要这样校验,和普通累加和有什么优势

使用特权

评论回复
5
airwill| | 2016-11-8 21:52 | 只看该作者
也就是累加和, 只是把溢出部分也加进去了
至于到底啥优势, 也说不上来

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

18

帖子

1

粉丝