c - 0 - 0 的补码

标签 c ip checksum integer-arithmetic ones-complement

作为背景,我正在尝试为存储在常量内存中的 IP 数据包计算校验和(无法就地修改)。在执行校验和之前,我应该假装数据包中现有的校验和为 0。而不是将所有数据复制到临时缓冲区并存储 0,我想对整个数据包进行校验和,然后减去结果中的现有校验和。

为此,我一直在寻找我找到的减法的补码版本 here .不幸的是,如果我使用它,并从 0 中减去 0,我得到 0x1111 而不是预期的 0:

  1. 将 0 转换为补码:[1111]
  2. 接下来,我们添加 0:[1111]
  3. 没有溢出位,所以我们完成了...

我本以为 0 - 0 是 0 -- 我错过了什么?

最佳答案

你不需要减法。

如果校验和有效,则计算整个数据包的校验和(包括校验和)应该为 0。如果结果不为 0,则数据包已损坏。

这就是路由器验证校验和的方式。

关于c - 0 - 0 的补码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44441138/

相关文章:

Hadoop 集群仅显示 1 个事件数据节点

php - 当我尝试插入 ip2long 整数时,错误的整数被插入到表中

c# - 有没有非常快速的校验和生成算法?

c - 计算 UDP 校验和时校验和错误

c - 查找数组中的最小数字

c - 这是 C 中的未定义行为吗?如果不能逻辑地预测输出

mobile - 如果请求来自移动电话网络,我能否仅通过 IP 地址判断?

java - 如何验证URL参数没有被篡改?

c - 对 C 程序的用户 session 实现资源限制

c - 如何使用 fscanf 读取文件