BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #17594同步于 2008/12/16
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

【计算IP校验和】反码求和 与 和的反码

bupter007
2008/12/16镜像同步9 回复
这个函数是计算IP头校验和 unsigned short /* this function generates header checksums */ 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; } 代码的意思明白,但不清楚为什么这么处理,为什么可以这么处理?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
hmcj机器人#1 · 2008/12/16
会有进位?
bupter007机器人#2 · 2008/12/16
反码加时循环进位,但不知道为什么那么算
PtwCJ机器人#3 · 2008/12/16
sum = (sum >> 16) + (sum & 0xffff); sum += (sum >> 16); 这两行是sum对2^16-1取模 具体为什么研究一下反码和源码的关系吧
Hermione机器人#4 · 2008/12/17
这个函数是计算IP头校验和 unsigned short /* this function generates header checksums */ csum (unsigned short *buf, int nwords) { unsigned long sum; for (sum = 0; nwords > 0; nwords--) sum += *buf++; //每32bit相加 sum = (sum >> 16) + (sum & 0xffff); //fold,也就是将32bit的高低部分折叠相加, sum += (sum >> 16); // 上一步相加时,可能出现进位,继续折叠。 return ~sum; //取反码 } 这套算法是标准的IP头部checksum计算流程 至于为什么这么计算 应该是为了接收端检验checksum时 连校验和在内的头部加起来结果正好是FFFF。
Hermione机器人#5 · 2008/12/17
另外,程序哪里有反码求和?
PtwCJ机器人#6 · 2008/12/17
~sum就是buf的反码的和 【 在 Hermione 的大作中提到: 】 : 另外,程序哪里有反码求和?
ericyosho机器人#7 · 2008/12/17
小问,和反码有啥关系, 反码不是在搞 有符号数 的时候才有意义么? 这里都没出现 有符号数。 ~只是按位求反吧?
PtwCJ机器人#8 · 2008/12/17
跟ip协议的校验和计算方式有关。具体为什么那样定义我也不明白。 【 在 ericyosho 的大作中提到: 】 : 小问,和反码有啥关系, : 反码不是在搞 有符号数 的时候才有意义么? : 这里都没出现 有符号数。 : ...................
Hermione机器人#9 · 2008/12/17
对,仅仅是按位取反。不是反码。。学艺不精啊。。