- 論壇徽章:
- 0
|
網(wǎng)際校驗(yàn)和是說(shuō):
發(fā)送方對(duì)要發(fā)送是數(shù)據(jù)劃分為許多16位(2個(gè)字節(jié)),如果數(shù)據(jù)的字節(jié)數(shù)
為奇數(shù),則在末尾補(bǔ)一個(gè)字節(jié)0湊成偶數(shù),對(duì)這些系列反碼求和,便得校驗(yàn)和;
可是我看網(wǎng)絡(luò)上的代碼都是先求和,再取反:
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;//補(bǔ)0的字節(jié)為高8位
}
cksum = (cksum>>16) + (cksum&0xffff); //將高16bit與低16bit相加
cksum += (cksum>>16); //將進(jìn)位到高位的16bit與低16bit 再相加
return (unsigned short)(~cksum);
}
可是我自己算了兩個(gè)16位:0x00ff,0xff00,按照定義是先取反再求和,
就是~(0x00ff)+~(0xff00)=0xff00+0x00ff=0xffff;
如果用上面的代碼得出的結(jié)論是0,請(qǐng)問(wèn)這是怎么回事?
我想網(wǎng)絡(luò)上的代碼應(yīng)該不會(huì)錯(cuò)的,可是為什么按照定義來(lái)算,
與程序計(jì)算得不對(duì)呢?錯(cuò)在哪了? |
|