我直接将上面的程序代码 弄到keil里面进行测试,发现那个程序代码运行完毕后,加入的数据只有前面的一半的数据,就是说,运行后的数据 acc 结果其实是 uip_buf[0]+uip_buf[1]+...+uip_buf[len/2](假设正好是偶数个的话)
如下是我的测试程序和结果:
#include <REG_MPC82G516.H>
#define u8_t unsigned char;
#define u16_t unsigned int;
u8_t uip_buf[]={0x01,0x02,0x01,0X02,0x01,0X02,0x01,0X02,0x01,0X02,0x01,0X02,0x01,0X02,0x01,0X02,0x01,0X02,0x01,0X02,0x01,0X02,0x01,0X02,0x01,0X02};
u16_t uip_chksum(unsigned int *sdata, unsigned int len)
{
unsigned int acc;
for(acc = 0; len > 1; len -= 2) {
acc += *sdata;
if(acc < *sdata) {
/* Overflow, so we add the carry to acc (i.e., increase by
one). */
++acc;
}
++sdata;
}
return acc;
}
void main()
{
/***************************************************************/
/* Compute the checksum of the TCP header. */
unsigned int hsum;
hsum = uip_chksum((unsigned int *)&uip_buf[0], 20);
/***************************************************************/
}
我调试后结果发现:acc 的最后结果是:0X000F ;其结果就是数组的前面len/2个数的和而已;并没有像想象中的 进行两两组合后再加的···
|