2017-06-16 47 views
0

我正在处理某些事情,并且我需要计算每个发送的数据的校验和。此校验和是低2个字节的所有字节查找缓冲区中所有字节的总和

的4字节的总和假设我有数据为:

Bytebuffer buffer = Bytebuffer.allocate(128); // assume i have filled buffer with some data 

下面是如何,我发现所有字节的总和,然后越来越低2字节。

byte array = buffer.array(); 
int checksum = 0; 

for(byte b : array){ 
    checksum += (int)b 
} 

checksum = (checksum & 0xff00ff) + ((checksum >> 0x08) & 0xff00ff); 
short result = (short) (checksum + (checksum >> 0x10)); 

但是,侦听这个数据的应用程序告诉我校验和是错误的。我的思维逻辑有什么错误?在此先感谢

回答

0

不要从缓冲区的支持array()读取。您通常不应该直接访问该数组。它忽略了缓冲区的限制和位置。相反,请使用get()方法。一个批量get:

byte[] bytes = new byte[buffer.remaining()]; 
buffer.get(bytes); 

或个人获得:

while (buffer.hasRemaining()) { 
    checksum += buffer.get() & 0xff; 
} 

请注意,如果你充满put()调用缓存起来,你需要调用flip()

的序列后的信道读或操作,调用此方法以用于信道写入或相对的序列制备得到操作。

+0

谢谢,它似乎像原来的缓冲区正在修改虽然。有没有办法呢? –

+0

这就是ByteBuffer的工作原理。它们就像您读写时更新定位标记的文件。这不是你应该尽量避免的。 –