checksum的计算和原理

来源:互联网 发布:微信可以打开淘宝 编辑:程序博客网 时间:2024/05/18 00:08

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.

原创粉丝点击