/*
pBuffer是要校驗(yàn)的數(shù)據(jù)報(bào)開始地址 nSize指定校驗(yàn)內(nèi)容長度,單位是字節(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)-軟件水平考試 |
|