用Java切片字节数组

时间:2013-08-21 20:56:35

标签: java

我正在尝试切片一个字节数组来修剪数组的第一部分。我正在使用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哈希值。我想要的是将整个缓冲区切片以仅传递没有预期散列的数据。

2 个答案:

答案 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;只需复制字节即可。