从字节缓冲区中提取值
Extract Values from Byte Buffer
我正在尝试将值从一个字节缓冲区放入另一个字节缓冲区。假设源字节缓冲区有 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....}。
谁能帮我解决这个问题,如何将字节缓冲区中的值复制到另一个而不获取空值。即空的。
当您用 8kb 的数据填充 src
时,将 8kb 的位置放入 20000 大小的缓冲区。
然后调用 src.get(b, 0, b.length)
,它尽职尽责地将价值 8kb 的数据(因为 b.length = 8kb)复制到 b 数组中... 从当前位置开始,即 中的 8kb。因此,它将字节 [8192,16384) 复制到您的字节数组中。当然,这些都是零。
那么,你是如何解决的?
这正是缓冲区的 flip()
方法的用途:从 'write' 模式切换到 'read' 模式。在 src 获得 8kb 的数据后,翻转你的缓冲区(此时,position() 为 0,而 limit() 现在是位置,即 8kb),那么这将工作得很好。
然后回到开始模式(准备向缓冲区写入最多 20000 个值),清除它。
这是缓冲区的流程:
- 您从位置 = 0 开始,限制 = 20000。
- 您将一些数据(在本例中为 8192)读入缓冲区。在某些时候,pos = 8192,limit = 20000.
- 你翻转:pos现在是0,limit = 8192,capacity = 20000。
- 你把所有的 8192 都读成了别的东西; pos 现在是 8192,limit 是 8192,cap 是 20000.
- 你清除pos现在是0,capacity是20000,也是limit。
- 重新回到起点。你可以永远这样做。
所以,写入缓冲区,翻转,从中读取,清除,写入,翻转,从中读取,清除 - 永远。
编辑:我错误地认为 flip() 也会让你从 'read mode' 回到写模式。它并没有真正做到这一点,清晰更好,更新了答案以反映这一点。
我正在尝试将值从一个字节缓冲区放入另一个字节缓冲区。假设源字节缓冲区有 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....}。
谁能帮我解决这个问题,如何将字节缓冲区中的值复制到另一个而不获取空值。即空的。
当您用 8kb 的数据填充 src
时,将 8kb 的位置放入 20000 大小的缓冲区。
然后调用 src.get(b, 0, b.length)
,它尽职尽责地将价值 8kb 的数据(因为 b.length = 8kb)复制到 b 数组中... 从当前位置开始,即 中的 8kb。因此,它将字节 [8192,16384) 复制到您的字节数组中。当然,这些都是零。
那么,你是如何解决的?
这正是缓冲区的 flip()
方法的用途:从 'write' 模式切换到 'read' 模式。在 src 获得 8kb 的数据后,翻转你的缓冲区(此时,position() 为 0,而 limit() 现在是位置,即 8kb),那么这将工作得很好。
然后回到开始模式(准备向缓冲区写入最多 20000 个值),清除它。
这是缓冲区的流程:
- 您从位置 = 0 开始,限制 = 20000。
- 您将一些数据(在本例中为 8192)读入缓冲区。在某些时候,pos = 8192,limit = 20000.
- 你翻转:pos现在是0,limit = 8192,capacity = 20000。
- 你把所有的 8192 都读成了别的东西; pos 现在是 8192,limit 是 8192,cap 是 20000.
- 你清除pos现在是0,capacity是20000,也是limit。
- 重新回到起点。你可以永远这样做。
所以,写入缓冲区,翻转,从中读取,清除,写入,翻转,从中读取,清除 - 永远。
编辑:我错误地认为 flip() 也会让你从 'read mode' 回到写模式。它并没有真正做到这一点,清晰更好,更新了答案以反映这一点。