LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2750|回复: 2

校验和算法

[复制链接]
发表于 2008-5-31 21:58:18 | 显示全部楼层 |阅读模式
不知这个问题是不是发在这里。下面是校验和算法源代码:
unsigned short CheckSum(unsigned short *szBUF,int iSize)
{
       unsigned long ckSum=0;
       while(size > 1)
              ckSum+=*szBUF++;

       if(iSize==1)
              ckSum+=*(unsigned char *)szBUF;

       ckSum=(ckSum>>16)+(ckSum&0xffff);
       ckSum+=(ckSum>>16);
       return(unsigned short )(~ckSum);

}
ckSum+=(ckSum>>16);这条语句不理解,假如ckSum的值是0x0001efab的话则经过这条语句之后ckSum的值为0x0001efac还是没有达到去掉进位的目的。如果上面的原因没有弟兄知道,请问下上面的算法中
ckSum=(ckSum>>16)+(ckSum&0xffff);
ckSum+=(ckSum>>16);
和下面的算法有何区别
while(ckSum>>16)
       ckSum=(ckSum>>16)+(ckSum&0xffff);
还望知道的兄弟朋友给解释下,我困惑好久了。谢谢!
发表于 2008-6-22 17:38:33 | 显示全部楼层
ckSum=(ckSum>>16)+(ckSum&0xffff);
/* 高16位+低16位 */

ckSum+=(ckSum>>16);
/* 加上进位 */


具体看校验和算法
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-25 22:23:47 | 显示全部楼层
我知道它的作用,只是不理解为何它可以这样计算,而
while(ckSum>>16)
ckSum=(ckSum>>16)+(ckSum&0xffff);
就很好理解,并且它不能解决我给出的例子的问题“假如ckSum的值是0x0001efab的话则经过这条语句之后ckSum的值为0x0001efac还是没有达到去掉进位只返回一个16位数的目的。”,而
while(ckSum>>16)
ckSum=(ckSum>>16)+(ckSum&0xffff);
就能够很好的解释。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表