`
victorwmh
  • 浏览: 207601 次
  • 性别: Icon_minigender_1
  • 来自: 宇宙
社区版块
存档分类
最新评论

和C++相对应Java的CheckSum

    博客分类:
  • java
 
阅读更多

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

 

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);
}
 
分享到:
评论
2 楼 victorwmh 2012-09-28  
我们项目是Java项目,但数据源来自不同的地方,有些还是合作单位提供的。
1 楼 cuisuqiang 2012-09-27  
那你们到底是Java项目还是C++的项目?

相关推荐

Global site tag (gtag.js) - Google Analytics