对于后台,我正在尝试计算存储在常量内存中的IP数据包的校验和(无法对其进行修改)。在做校验和之前,我应该假装数据包中的现有校验和为0.而不是将所有数据复制到临时缓冲区,并存储0,我想对整个数据包进行校验和,然后减去结果中的现有校验和。
要做到这一点,我一直在寻找一个补语的减法版本,我发现here。不幸的是,如果我使用它,并从0减去0,我得到0x1111而不是预期的0:
我原本预计0 - 0会是0 - 我错过了什么?
答案 0 :(得分:1)
您无需减去。
如果校验和有效,则计算整个数据包的校验和(包括校验和)应该为0.如果结果不为0,则数据包已损坏。
这是路由器验证校验和的方式。
答案 1 :(得分:0)
我建议在One's Complement
上阅读本教程https://courses.cs.vt.edu/csonline/NumberSystems/Lessons/SubtractionWithOnesComplement/index.html
我认为这很容易:
0000 - 0000 = 0000 + 1111 = 1111
由于最后一个1111
位于One's Complement表单中,我们知道这是一个带有前导1
的负数。
最后的操作是一个补充(1111
)。
最终答案是- 0000
。
如你所知,一个人的补语计算是两个表格
提出零0
。