/*
pBuffer是要校驗(yàn)的數(shù)據(jù)報(bào)開始地址
nSize指定校驗(yàn)內(nèi)容長(zhǎng)度,單位是字節(jié)
*/
unsigned short checksum_calculating(unsigned short *pBuffer, int nSize)
{
unsigned long dwCksum = 0; // 32位累加和
unsigned char* p=(unsigned char*)&dwCksum;
// 以兩字節(jié)為單位反復(fù)累加
while(nSize > 1)
{
dwCksum += *pBuffer++;
printf("\t\t%.2x %.2x %.2x %.2x\n",*p,*(p+1),*(p+2),*(p+3));
nSize -= sizeof(unsigned short);
}
printf("\t\t%.2x %.2x %.2x %.2x\n",*p,*(p+1),*(p+2),*(p+3));
// 如果總字節(jié)數(shù)為奇數(shù)則加上最后一個(gè)字節(jié)
if (nSize)
{
dwCksum += *(unsigned char*) pBuffer;
printf("\t\t%.2x %.2x %.2x %.2x\n",*p,*(p+1),*(p+2),*(p+3));
}
//把32位整數(shù)高位中的進(jìn)位累加到低16位
while(dwCksum>>16){
dwCksum = (dwCksum&0xffff) + (dwCksum>>16);
printf("\t\t%.2x %.2x %.2x %.2x\n",*p,*(p+1),*(p+2),*(p+3));
}
//取反得到校驗(yàn)和
dwCksum = ~dwCksum;
printf("\t\t%.2x %.2x %.2x %.2x\n",*p,*(p+1),*(p+2),*(p+3));
// 返回16位校驗(yàn)和
return (unsigned short) (dwCksum);
} 來源:教育聯(lián)展網(wǎng)-軟件水平考試