C++ 校验和和和位移位
我正在学习创建一个原始数据包并按照教程发送它。在我找到生成校验和的代码之前,一切都是有意义的C++ 校验和和和位移位,c++,checksum,C++,Checksum,我正在学习创建一个原始数据包并按照教程发送它。在我找到生成校验和的代码之前,一切都是有意义的 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 >
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?毕竟,为什么要再次添加进位呢?这是因为可能会执行第二次执行吗?正在计算的校验和为16位无符号短校验和通常为16位,但变量和为无符号长校验和,因此可能为32位 因此,操作sum>>16捕获和的高位字,所有对字的总和超过16位的时间都可以保持。然后将其与sum&0xffff混合,它只是sum的低位字
通过这种方式,总和的所有位都被折叠起来,以便对最终结果作出贡献。计算的校验和为16位无符号短,通常为16位,但变量总和为无符号长,因此可能为32位 因此,操作sum>>16捕获和的高位字,所有对字的总和超过16位的时间都可以保持。然后将其与sum&0xffff混合,它只是sum的低位字 通过这种方式,总和的所有位都被折叠起来,以便对最终结果作出贡献。行:
sum = (sum >> 16) + (sum & 0xffff);
在32位整数中添加左右16位字。它基本上是将数字一分为二,然后将两半相加。sum>>16给出左半部分,sum&0xffff给出右半部分
然后当这两个加在一起时,它们可能会溢出。这一行:
sum += (sum >> 16);
将溢出添加回原始编号。行:
sum = (sum >> 16) + (sum & 0xffff);
在32位整数中添加左右16位字。它基本上是将数字一分为二,然后将两半相加。sum>>16给出左半部分,sum&0xffff给出右半部分
然后当这两个加在一起时,它们可能会溢出。这一行:
sum += (sum >> 16);
将溢出量加回到原来的数字。大脑显然停止工作了Xbrain显然停止工作了X