从现有字节[]生成新的byte []

时间:2015-04-22 19:47:16

标签: java arrays

我想从现有的字节数组生成一个“new”字节数组,而不必从堆中实际分配。换句话说,“新”字节数组应该与现有数据共享相同的基础数据。问题是,我希望新的字节数组具有不同的长度。

byte[] buffer = { 0x01, 0x02, 0x04, 0x08, 0x10 };
byte[] shared = slice(buffer, 1, 3);
/* shared should be { 0x02, 0x04, 0x08 } and have length of 3 */

我这样做是因为我有一个字节数组,我需要从中提取数据包,然后将该数据包传递给单参数方法,该方法只需要byte[]。我想避免复制数据包中包含的数据。出于我的目的,可以假设buffer的内容不会在shared的范围内发生变化。

这可能吗?在使用缓冲区时,似乎是一个常见的事情。提前谢谢,

3 个答案:

答案 0 :(得分:5)

不,Java中不可能有(部分)共享相同内存的不同byte[]

您可以使用java.nio.ByteBuffer,而不是使用byte[],它允许您以您希望的方式切片缓冲区。

ByteBuffer buffer = ByteBuffer.wrap(new byte[]{ 0x01, 0x02, 0x04, 0x08, 0x10 });

buffer.position(1);
buffer.limit(4);

ByteBuffer shared = buffer.slice();

请注意ByteBuffer返回的buffer.slice()引用与原始缓冲区相同的基础字节数组。

答案 1 :(得分:0)

不幸的是,两个独立的阵列不可能占用相同的内存空间,但长度不同。它们必须是指向内存中同一对象的两个变量。

你能不能将字节数组传递给方法?从我如何解释你的问题,这是你想要实现的目标。

byte[] array = packet.bytes;
byte[] slicedArray = slice(array, 1, 3);
method(slicedArray);

答案 2 :(得分:-1)

你可以试试这个:

byte[] buffer = { 0x01, 0x02, 0x04, 0x08, 0x10 };
byte[] shared = Arrays.copyOfRange(buffer, 1, 4);
/* shared should be { 0x02, 0x04, 0x08 } and have length of 3 */