Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找缓冲区中所有字节的总和_Java_Arrays_Checksum_Bytebuffer - Fatal编程技术网

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

Java 查找缓冲区中所有字节的总和,java,arrays,checksum,bytebuffer,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)

我正在做一些事情,我被要求用发送的每个数据计算校验和。该校验和是所有字节的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));

然而,监听这些数据的应用程序告诉我校验和是错误的。我的思维逻辑有什么问题?提前感谢

不要读取缓冲区的备份
array()
。通常不应直接访问该阵列。它忽略缓冲区的限制和位置。相反,请使用
get()
方法。批量获取:

byte[] bytes = new byte[buffer.remaining()];
buffer.get(bytes);
或个人获得:

while (buffer.hasRemaining()) {
    checksum += buffer.get() & 0xff;
}
请注意,如果已使用
put()
调用填充了缓冲区,则需要调用

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


谢谢,看起来原始缓冲区正在被修改。有没有办法不这样做?这就是
ByteBuffer
s的工作原理。它们就像带有定位标记的文件,在读写时会更新。这不是你应该避免的事情。