我正在尝试切片一个字节数组来修剪数组的第一部分。我正在使用ByteBuffer,但它的行为并不像我期望的那样。
byte[] myArray = new byte[10];
ByteBuffer buf = ByteBuffer.wrap(myArray);
buf.position(5);
ByteBuffer slicedBuf = buf.slice();
byte[] newArray = slicedBuf.array();
我希望newArray的大小为5,只包含我的ByteBuffer的最后一部分。而是返回完整的字节数组。我知道这是因为“后备缓冲区”一直都是一样的。
如何切片以仅包含数组中所需的部分?
编辑:添加了上下文
从网络接收字节。缓冲区形成如下:
[ SHA1 hash ] [ data... lots of it ]
我已经有了一个函数,它将一个字节数组作为参数并计算SHA1哈希值。我想要的是将整个缓冲区切片以仅传递没有预期散列的数据。
答案 0 :(得分:66)
您可以使用Arrays.copyOfRange
方法。例如:
// slice from index 5 to index 9
byte[] slice = Arrays.copyOfRange(myArray, 5, 10);
答案 1 :(得分:8)
您创建的ByteBuffer
正由该阵列支持。当您致电slice()
时,您会有效地收到该数据的特定视图:
创建一个新的字节缓冲区,其内容是此缓冲区内容的共享子序列。
因此,在返回的array()
上调用ByteBuffer
会完整地返回支持数组。
要从该视图中提取所有字节,您可以执行以下操作:
byte[] bytes = new byte[slicedBuf.remaining()];
slicedBuf.read(bytes);
该视图中的字节将被复制到新数组中。
编辑以添加下面的评论:值得注意的是,如果你有兴趣做的就是将字节从一个byte[]
复制到另一个byte[]
,那么没有理由使用ByteBuffer
;只需复制字节即可。