8-bit互联网校验和计算咨询:我的计算方法是否有误?
8位互联网校验和的正确计算方法
你忽略了进位循环相加的关键步骤,这是互联网校验和计算里很容易踩的坑!我们一步步来拆解正确的计算过程:
首先,你的原始数据是四个8位字节:
- 3 →
00000011 - 4 →
00000100 - 5 →
00000101 - 6 →
00000110
正确的相加流程(含进位处理)
- 先加前两个数:
00000011 + 00000100 = 00000111(十进制7,无进位,没问题) - 加第三个数:
00000111 + 00000101 = 00001100(十进制12,还是无进位,没问题) - 加第四个数:
00001100 + 00000110 = 00010010(十进制18,这里出现了进位1——因为8位的范围是0~255,18的二进制写成8位是00010010,其中高位的0001就是溢出的进位值) - 关键步骤:把进位循环加回低8位:
把进位的1(二进制00000001)加到当前的低8位00000010上,得到:00000010 + 00000001 = 00000011(十进制3) - 最后对这个结果取1的补码(每一位取反):
00000011 → 11111100
为什么要处理进位?
互联网校验和的设计要求是:将所有数据视为无符号8位整数的序列,相加时如果总和超过8位,必须把溢出的进位部分循环加到结果中,直到得到一个8位的和。这样做的目的是保证校验和能覆盖所有位的溢出情况,避免因为进位丢失导致校验错误。
你之前的计算直接跳过了进位循环相加的步骤,所以结果才会和预期不符。
内容的提问来源于stack exchange,提问作者NewDev90




