ping中用到的校验和算法

本文详细介绍了十六进制补码求和算法的实现过程,包括使用32位累加器逐个累加16位单词,并在末尾处理奇数位字节的情况。算法最终通过位移和取反操作,确保结果为16位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

in_cksum(addr, len)
u_short *addr;
int len;
{
        register int nleft = len;
        register u_short *w = addr;
        register u_short answer;
        register int sum = 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_short u = 0;

                *(u_char *)(&u) = *(u_char *)w ;
                sum += u;
        }

      /*
         * 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 */ (如果超过16位的最大的情况也加起来) 
       answer = ~sum; /* truncate to 16 bits */ (取反)
        return (answer);
}

转载于:https://www.cnblogs.com/lxgeek/archive/2012/01/05/2313197.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值