有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中的字节数组切片

我正在尝试对字节数组进行切片,以修剪数组的第一部分。我正在使用ByteBuffer,但它的行为与我预期的不同

byte[] myArray = new byte[10];
ByteBuffer buf = ByteBuffer.wrap(myArray);
buf.position(5);
ByteBuffer slicedBuf = buf.slice();
byte[] newArray = slicedBuf.array();

我希望新数组的大小为5,只包含字节缓冲区的最后一部分。而是返回完整字节数组。我明白这是因为“后备缓冲区”一直都是一样的

如何切片以仅获得阵列的所需部分

编辑:添加上下文

字节从网络接收。缓冲区是这样形成的:

[ SHA1 hash ] [ data... lots of it ]

我已经有了一个函数,它将字节数组作为参数,并计算SHA1散列。我想要的是分割整个缓冲区,只传递数据,而不传递预期的散列


共 (2) 个答案

  1. # 1 楼答案

    可以使用^{}方法。例如:

    // slice from index 5 to index 9
    byte[] slice = Arrays.copyOfRange(myArray, 5, 10);
    
  2. # 2 楼答案

    您创建的ByteBuffer由该数组支持。当你调用slice()时,你实际上会收到一个特定的视图

    Creates a new byte buffer whose content is a shared subsequence of this buffer's content.

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

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

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

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

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