Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 校验和和和位移位_C++_Checksum - Fatal编程技术网

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