查找缓冲区中所有字节的总和
问题描述:
我正在处理某些事情,并且我需要计算每个发送的数据的校验和。此校验和是低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));
但是,侦听这个数据的应用程序告诉我校验和是错误的。我的思维逻辑有什么错误?在此先感谢
答
不要从缓冲区的支持array()
读取。您通常不应该直接访问该数组。它忽略了缓冲区的限制和位置。相反,请使用get()
方法。一个批量get:
byte[] bytes = new byte[buffer.remaining()];
buffer.get(bytes);
或个人获得:
while (buffer.hasRemaining()) {
checksum += buffer.get() & 0xff;
}
请注意,如果你充满put()
调用缓存起来,你需要调用flip()
。
的序列后的信道读或放操作,调用此方法以用于信道写入或相对的序列制备得到操作。
谢谢,它似乎像原来的缓冲区正在修改虽然。有没有办法呢? –
这就是ByteBuffer的工作原理。它们就像您读写时更新定位标记的文件。这不是你应该尽量避免的。 –