网际校验和算法实现 佟强 2008.10.20
原理请参考:
网际校验和算法: http://blog.csdn.net/microtong/archive/2008/10/20/3112139.aspx
网际校验和算法的特征:http://blog.csdn.net/microtong/archive/2008/10/20/3112157.aspx
- /*
- pBuffer是要校验的数据报开始地址
- nSize指定校验内容长度,单位是字节
- */
- unsigned short checksum_calculating(unsigned short *pBuffer, int nSize)
- {
- unsigned long dwCksum = 0; // 32位累加和
- unsigned char* p=(unsigned char*)&dwCksum;
- // 以两字节为单位反复累加
- 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));
- // 如果总字节数为奇数则加上最后一个字节
- if (nSize)
- {
- dwCksum += *(unsigned char*) pBuffer;
- printf("/t/t%.2x %.2x %.2x %.2x/n",*p,*(p+1),*(p+2),*(p+3));
- }
- //把32位整数高位中的进位累加到低16位
- while(dwCksum>>16){
- dwCksum = (dwCksum&0xffff) + (dwCksum>>16);
- printf("/t/t%.2x %.2x %.2x %.2x/n",*p,*(p+1),*(p+2),*(p+3));
- }
- //取反得到校验和
- dwCksum = ~dwCksum;
- printf("/t/t%.2x %.2x %.2x %.2x/n",*p,*(p+1),*(p+2),*(p+3));
- // 返回16位校验和
- return (unsigned short) (dwCksum);
- }