【发布时间】:2014-08-31 12:34:16
【问题描述】:
我正在学习创建一个原始数据包并按照this 教程发送它。在我到达生成校验和的代码之前,一切都是有意义的。
unsigned short csum (unsigned short *buf, int nwords)
{
unsigned long sum;
for (sum = 0; nwords > 0; nwords--)
sum += *buf++;
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
return ~sum;
}
看起来他正在总结缓冲区中的所有单词。但是当我点击
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
我完全迷路了。看起来他向右移动了所有位,基本上丢弃了除结转之外的所有位,然后将其添加回原始总和?为什么 & 0xfff 是必要的?毕竟,为什么要再次添加执行位?是因为可能会有第二次执行吗?
【问题讨论】:
-
大脑显然停止工作了(X