和C++相对应Java的CheckSum

这两天在做个接收海量数据的项目,服务端接收处理客户端发送上来的数据。本来没什么可以多说的,但中间出了个有趣的插曲,让我折腾半天不管怎么调就是不对。原来是一有个性的哥们在做数据校验和时,出于自己的兴趣爱好更改协议中约定的校验值计算方法,用了他常用或偏爱的那种方法。本来想让他修改的,可出于升级工作和服务端刚建设的综合考虑,最后还是采取了服务端更改检验和计算方式的做法。为纪念为之付出艰辛调试的几个小时,在此立字铭记。

 

C++计算CheckSum的方法:

unsigned short CAoe::CheckSum(unsigned short *buffer, int size)
{
	unsigned long cksum=0;	
	while(  size>1  )		
	{		
		cksum+=*buffer++;		
		size-=sizeof(unsigned short);		
	}	
	if( size )		
	{		
		cksum+=*(unsigned char *)buffer;		
	}	
	
	while (cksum>>16)
	{
		cksum=(cksum>>16)+(cksum & 0xffff);
	}
	return (unsigned short) (~cksum);	
}

 

Java计算CheckSum的方法:

public char checkSum(byte[] buf, int size) {

	long ckSum = 0;
	for (int i = 0; i < size - 1; i += 2) {
		ckSum += (((buf[i + 1] << 8) & 0xff00) ^ (buf[i] & 0xff));
	}
		
	if (size % 2 == 1) {
		ckSum += buf[size - 1] & 0xff;
	}
		
	ckSum = (ckSum >> 16) + (ckSum & 0xffff);
	ckSum += (ckSum >> 16);

	return (char) (~ckSum);
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值