我正在处理某些事情,我需要计算每个发送数据的校验和。该校验和是所有字节的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));
但是,监听此数据的应用程序告诉我校验和错误。我的思维逻辑可能有什么问题?在此先感谢
答案 0 :(得分:0)
请勿从缓冲区的后备array()
中读取。您通常不应该直接访问该数组。它忽略了缓冲区的限制和位置。相反,请使用get()
方法。批量获取:
byte[] bytes = new byte[buffer.remaining()];
buffer.get(bytes);
或个人得到:
while (buffer.hasRemaining()) {
checksum += buffer.get() & 0xff;
}
请注意,如果您通过put()
来电填充了缓冲区,则需要致电flip()
。
在一系列通道读取或放置操作之后,调用此方法以准备一系列通道写入或相对 get 操作。