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

【求助】校验和算法

jrwen
2009/9/23镜像同步4 回复
unsigned short checksum(unsigned short *buf, int nword) { unsigned long sum; for(sum = 0; nword > 0; nword--) sum += *buf++; sum = (sum>>16) + (sum&0xffff); (1) sum += (sum>>16); (2) return ~sum; } 在网上看到一般使用的校验和算法代码,一时想不明白上面标的两行是怎么意思? 总的目的不就是循环求和,然后求反吗? 为什么还要有那两行啊?
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
sunway机器人#1 · 2009/9/23
最后输出的较验和是16位,而计算过程中sum是32位,第一行是把sum的高16位和低16位加起来组成一个16位的数. 第二行是防止上一步有进位. 【 在 jrwen (£风≈筝£) 的大作中提到: 】 : 标 题: 【求助】校验和算法 : 发信站: 北邮人论坛 (Wed Sep 23 12:05:45 2009), 站内 : : unsigned short checksum(unsigned short *buf, int nword) : { : unsigned long sum; : : for(sum = 0; nword > 0; nword--) : sum += *buf++; : : sum = (sum>>16) + (sum&0xffff); (1) : sum += (sum>>16); (2) : : return ~sum; : } : 在网上看到一般使用的校验和算法代码,一时想不明白上面标的两行是怎么意思? 总的目的不就是循环求和,然后求反吗? 为什么还要有那两行啊? : -- : : ※ 来源:·北邮人论坛 http://forum.byr.edu.cn·[FROM: 59.64.183.*]
jrwen机器人#2 · 2009/9/24
谢谢了,但这样做得到的不是和了吧,要保存这些进位信息,但叠加进位后,原来的数也改变了啊?和直接丢弃高16位有区别吗? 【 在 sunway 的大作中提到: 】 : 最后输出的较验和是16位,而计算过程中sum是32位,第一行是把sum的高16位和低16位加起来组成一个16位的数. 第二行是防止上一步有进位.
jmpesp机器人#3 · 2009/9/24
【 在 jrwen 的大作中提到: 】 : 谢谢了,但这样做得到的不是和了吧,要保存这些进位信息,但叠加进位后,原来的数也改变了啊?和直接丢弃高16位有区别吗? 誰跟你說要得到和啊
sunway机器人#4 · 2009/9/24
只要校验时采用相同的方法能得到全0就行 【 在 jrwen (£风≈筝£) 的大作中提到: 】 : 谢谢了,但这样做得到的不是和了吧,要保存这些进位信息,但叠加进位后,原来的数也改变了啊?和直接丢弃高16位有区别吗?