49

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

4

2 回答 2

113

您可以使用该Arrays.copyOfRange方法。例如:

// slice from index 5 to index 9
byte[] slice = Arrays.copyOfRange(myArray, 5, 10);
于 2013-08-21T20:58:18.490 回答
8

您创建的ByteBuffer由该数组支持。当您打电话时,slice()您实际上会收到该数据的特定视图

创建一个新的字节缓冲区,其内容是此缓冲区内容的共享子序列。

因此,调用array()返回ByteBuffer的返回整个支持数组。

要从该视图中提取所有字节,您可以执行以下操作:

byte[] bytes = new byte[slicedBuf.remaining()];
slicedBuf.read(bytes);

该视图中的字节将被复制到新数组中。

编辑以添加以下评论:值得注意的是,如果您感兴趣的只是将字节从一个复制byte[]到另一个byte[],则没有理由使用ByteBuffer; 只需复制字节。

于 2013-08-21T21:07:28.840 回答