返回信息流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;
}
在网上看到一般使用的校验和算法代码,一时想不明白上面标的两行是怎么意思? 总的目的不就是循环求和,然后求反吗? 为什么还要有那两行啊?
这是一条镜像帖。来源:北邮人论坛 / cpp / #28994同步于 2009/9/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
【求助】校验和算法
jrwen
2009/9/23镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
最后输出的较验和是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.*]
谢谢了,但这样做得到的不是和了吧,要保存这些进位信息,但叠加进位后,原来的数也改变了啊?和直接丢弃高16位有区别吗?
【 在 sunway 的大作中提到: 】
: 最后输出的较验和是16位,而计算过程中sum是32位,第一行是把sum的高16位和低16位加起来组成一个16位的数. 第二行是防止上一步有进位.
【 在 jrwen 的大作中提到: 】
: 谢谢了,但这样做得到的不是和了吧,要保存这些进位信息,但叠加进位后,原来的数也改变了啊?和直接丢弃高16位有区别吗?
誰跟你說要得到和啊
只要校验时采用相同的方法能得到全0就行
【 在 jrwen (£风≈筝£) 的大作中提到: 】
: 谢谢了,但这样做得到的不是和了吧,要保存这些进位信息,但叠加进位后,原来的数也改变了啊?和直接丢弃高16位有区别吗?