linux生成checksum,checksum的计算和原理

checksum的计算和原理

unsigned short CheckSum(char *addr, int count)

{

register int sum = 0;

while( count > 1 )

{

sum =sum+*(unsigned short*)addr;

addr+=2;

count -= 2;

}

if( count > 0 )//=1,说明count为奇数

sum += *addr;

while (sum>>16)//当和的高16位不为0,把高16位作为校验和的一部分求和,

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

return (short)~sum;

}

/*****************************八位checksum*********************************/

char CheckSum(char *addr, int count)

{

UINT sum = 0;

while( count > 0 )

{

sum =sum+*addr;

addr += 1;

count -= 1;

}

while (sum>>8)

sum = (sum & 0xff) + (sum >> 8);

return (char)~sum;

}

原理:

1、校验和的计算:将缓冲区的数据中挨个数累加(X),然后取反输出(~X)。

2、校验:将缓冲区的数据和校验和(~X)一起求校验和,累加和(Y(及取反输出(~Y)。Y =缓冲区的数据累加(X(+校验和(~X)=0XFFFF。~Y=0。所以当结果为0,说明数据传输没问题。

如果校验和计算时高16位(XH)不等于零,(XH)+(XL)= Z,新校验和为~Z。 校验时,再次求校验和 :先求和(XH)*2^16 +(XL)+ ~Z= (XH)*2^16 +(XL)+ 0XFFFF - Z =(XH)*2^16+(0XFFFF -(XH))=Y.YH=XH,YL=(0XFFFF -(XH),YH+YL=0XFFFF.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值