|
不知这个问题是不是发在这里。下面是校验和算法源代码:
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);
还望知道的兄弟朋友给解释下,我困惑好久了。谢谢! |
|