gpt4 book ai didi

java - 从字节缓冲区中提取值

转载 作者:行者123 更新时间:2023-12-01 16:52:31 29 4
gpt4 key购买 nike

我试图将一个字节缓冲区中的值放入另一个字节缓冲区。假设源字节缓冲区的限制为 20KB,其中存在的值仅到 8kb,例如:{1,2,3,4.... 到 8kb,之后是 0,0,0,0,0,.. .直到20kb}现在我只想将 8kb 值复制到目标字节缓冲区,而不是“0”值。

下面是尝试过的代码。

ByteBuffer src = ByteBuffer.allocate(20000);
ByteBuffer dst = ByteBuffer.allocate(32000);
//Adding values to src till 8kb

byte[] b = new byte[src.position()];
src.get(b, 0, b.length); // to get the values from src byte buffer to byte array
if(dst.remaining() > b.length){
dst.put(b); // to put values got from src to dst
}
src.clear(); // to empty the src

在这里我没有得到 src 中字节数组中的值。我得到字节数组中的 {0,0,0,0,0....}。

任何人都可以帮助我,如何将字节缓冲区中的值复制到另一个而不获取空值。即空的。

最佳答案

当您填写src时具有 8kb 值(value)的数据,位于 20000 大小的缓冲区中 8kb 的位置。

然后您调用src.get(b, 0, b.length)它尽职尽责地将 8kb 的数据(因为 b.length = 8kb)复制到 b 数组中...从当前位置开始,即 8kb。因此,它将字节 [8192,16384) 复制到字节数组中。当然,这些都是零。

那么,如何解决这个问题呢?

这正是 flip() 的内容buffers 的方法是:从“写”模式翻转到“读”模式。当 src 获得了 8kb 的数据后,翻转你的缓冲区(此时,position() 为 0,而 limit() 现在的位置就是 8kb),那么这会很好用。

然后要返回到开始模式(准备向缓冲区写入最多 20000 个值),请清除它。

这就是缓冲区的流程:

  • 您从位置 = 0 开始,限制 = 20000。
  • 您将一定量的数据(本例中为 8192)读入缓冲区。在某个时刻,pos = 8192,limit = 20000。
  • 你翻转:pos 现在为 0,limit = 8192,capacity = 20000。
  • 您将所有 8192 读入其他内容; pos 现在为 8192,限制为 8192,上限为 20000。
  • 您清除 pos 现在为 0,容量为 20000,限制也是如此。
  • 再次回到起点。你可以永远这样做。

所以,写入缓冲区,翻转,从中读取,清除,写入,翻转,从中读取,清除 - 永远。

编辑:我错误地认为 Flip() 也会将您从“读取模式”转换回写入模式。它并没有真正做到这一点,清晰更好,更新了答案以反射(reflect)这一点。

关于java - 从字节缓冲区中提取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61661407/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com