请问个网际校验和的问题
网际校验和是说:发送方对要发送是数据划分为许多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,请问这是怎么回事?
我想网络上的代码应该不会错的,可是为什么按照定义来算,
与程序计算得不对呢?错在哪了?
页:
[1]