
- 就是有点不明白,为啥这么弄了以后,接收方最后算出来就会全是 1 ?(当无比特差错时)(居然最后还有个叠加操作)
unsigned short checksum(unsigned short *buf,int nword)
{
unsigned long sum;
for(sum=0;nword>0;nword--)
sum += *buf++;
sum = (sum>>16) + (sum&0xffff);
sum += (sum>>16);
return ~sum;
}
- 上面这个校验和算法,是先求和,最后取反码,好像也可以(因为算出来是一样的)?这是什么原理(因为上图是 先取反码,再求和,最后叠加。难道这三步 任意换顺序都可以吗)
sum += (sum>>16);这一步看起来是多余的吧?因为上一句就把 前 16 比特 和 后 16 比特 累加了啊?
参考文章: