作为背景,我正在尝试为存储在常量内存中的 IP 数据包计算校验和(无法就地修改)。在执行校验和之前,我应该假装数据包中现有的校验和为 0。而不是将所有数据复制到临时缓冲区并存储 0,我想对整个数据包进行校验和,然后减去结果中的现有校验和。
为此,我一直在寻找我找到的减法的补码版本 here .不幸的是,如果我使用它,并从 0 中减去 0,我得到 0x1111 而不是预期的 0:
- 将 0 转换为补码:[1111]
- 接下来,我们添加 0:[1111]
- 没有溢出位,所以我们完成了...
我本以为 0 - 0 是 0 -- 我错过了什么?
最佳答案
你不需要减法。
如果校验和有效,则计算整个数据包的校验和(包括校验和)应该为 0。如果结果不为 0,则数据包已损坏。
这就是路由器验证校验和的方式。
关于c - 0 - 0 的补码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44441138/