Chinaunix

标题: 请问个网际校验和的问题 [打印本页]

作者: netdoger    时间: 2016-03-31 10:31
标题: 请问个网际校验和的问题
网际校验和是说:
发送方对要发送是数据划分为许多16位(2个字节),如果数据的字节数
为奇数,则在末尾补一个字节0凑成偶数,对这些系列反码求和,便得校验和;
可是我看网络上的代码都是先求和,再取反:
unsigned short checksum(unsigned short* buffer, int size)
{
    unsigned long cksum = 0;
    while(size>1)
    {
                cksum += *buffer++;
                size -= 2;
    }
    if(size)
    {
                cksum += *(u_char*)buffer;//补0的字节为高8位
     }
        cksum = (cksum>>16) + (cksum&0xffff);  //将高16bit与低16bit相加
        cksum += (cksum>>16);          //将进位到高位的16bit与低16bit 再相加
        return (unsigned short)(~cksum);
}
可是我自己算了两个16位:0x00ff,0xff00,按照定义是先取反再求和,
就是~(0x00ff)+~(0xff00)=0xff00+0x00ff=0xffff;
如果用上面的代码得出的结论是0,请问这是怎么回事?
我想网络上的代码应该不会错的,可是为什么按照定义来算,
与程序计算得不对呢?错在哪了?




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2