我想从现有的字节数组生成一个“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
的范围内发生变化。
这可能吗?在使用缓冲区时,似乎是一个常见的事情。提前谢谢,
答案 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 */