IP报文中的校验和函数实现

//本函数 为CRC16校验

//data为数据地址,len为长度

static int icmp_cksum(void *data, int len)

{
int nleft = len;
uint16_t *data_tmp = (uint16_t *)data;    
int sum = 0;    //校验和存储变量
uint16_t tmp = 0;


//以2字节为一数据累加

while(nleft > 1)
{
sum += *data_tmp++;
nleft -= 2;

}

       //如果是奇数个字节,最后字节如下处理

if(nleft == 1)
{
*(uint8_t *)(&tmp) = *(uint8_t *)data_tmp;
sum += tmp;
}


sum = (sum >> 16) + (sum &0xffff);
sum += (sum >> 16);


tmp = ~sum; //取反


return tmp;
}

猜你喜欢

转载自blog.csdn.net/szkbsgy/article/details/12876623