查找缓冲区中所有字节的总和

时间:2017-06-16 13:20:28

标签: java arrays checksum bytebuffer

我正在处理某些事情,我需要计算每个发送数据的校验和。该校验和是所有字节的4字节和的低2字节

假设我的数据为:

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));

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

1 个答案:

答案 0 :(得分:0)

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

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

或个人得到:

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

请注意,如果您通过put()来电填充了缓冲区,则需要致电flip()

  

在一系列通道读取或放置操作之后,调用此方法以准备一系列通道写入或相对 get 操作。