自己写不行吗?简单的相加,只是注意和超过0X10000时要将和-0X10000+1

解决方案 »

  1.   

    unsigned short in_cksum(char *packet, int len)
    {
    register int nleft = len;
    register u_short *w = (u_short *)packet;
    register int sum = 0;
    u_short answer = 0; /*
    * Our algorithm is simple, using a 32 bit accumulator (sum), we add
    * sequential 16 bit words to it, and at the end, fold back all the
    * carry bits from the top 16 bits into the lower 16 bits.
    */
    while (nleft > 1)  
    {
    sum += *w++;
    nleft -= 2;
    } /* mop up an odd byte, if necessary */
    if (nleft == 1)
    {
    *(u_char *)(&answer) = *(u_char *)w ;
    sum += answer;
    } /* add back carry outs from top 16 bits to low 16 bits */
    sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */
    sum += (sum >> 16);         /* add carry */
    answer = ~sum;              /* truncate to 16 bits */
    return(answer);
    }
      

  2.   

    应该从哪个位置到哪个位置开始计算校验和?