这几乎肯定是一个非常愚蠢的问题,但由于某种原因,我在互联网校验和计算中遇到了麻烦。所有的算法基本上是这个样子:互联网校验和位移
WORD chksm(WORD *startpos, WORD checklen){
ulong sum = 0;
WORD answer = 0;
while (checklen > 1)
{
sum += *startpos++;
checklen -= 2;
}
if (checklen == 1)
{
*(BYTE *)(&answer) = *(BYTE *)startpos;
sum += answer;
}
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
answer = ~sum;
return answer;}
我的一切除了线清晰:
sum += (sum >> 16);
它看起来像之前它增加了前16位的行底部16位,在顶部16位保留全零。如果是这样,那么现在不会总和>> 16现在等于零?如果是这样,为什么那条线呢?
或者我(有可能)今天刚刚完全失智吗?
太棒了。感谢大家。 – 2009-10-20 22:20:16