分割字节数组

34

在Java中,是否可以从字节数组中获取特定的字节?

我有一个字节数组:

byte[] abc = new byte[512]; 

我想要从这个数组中获得三个不同的字节数组:

  1. 字节0-127
  2. 字节128-255
  3. 字节256-511

我尝试使用abc.read(byte[], offset,length),但只有在offset为0时才起作用,其他任何值都会抛出IndexOutOfBoundsException异常。

我做错了什么?


偏移量位于目标数组中,而不是源数组中。 - charlie
3个回答

71

5
哇,不知道那件事。 - Jonathan Feinberg
@Jonathan Feinberg:这是Java 6中的新功能。 - Powerlord
2
@Tara 注意,结束范围不应与起始范围相同。即,如果您正在从0,127提取,则应为Arrays.copyOfRange(record,0,128); - Dead Programmer

15

Arrays.copyOfRange()是Java 1.6引入的。如果您使用的是旧版本,则它在内部使用System.arraycopy(...)。以下是其实现方式:

public static <U> U[] copyOfRange(U[] original, int from, int to) {
    Class<? extends U[]> newType = (Class<? extends U[]>) original.getClass();
    int newLength = to - from;
    if (newLength < 0) {
        throw new IllegalArgumentException(from + " > " + to);
    }
    U[] copy = ((Object) newType == (Object)Object[].class)
        ? (U[]) new Object[newLength]
        : (U[]) Array.newInstance(newType.getComponentType(), newLength);
    System.arraycopy(original, from, copy, 0,
                     Math.min(original.length - from, newLength));
    return copy;
}

-1 这不同于标准版本。它不是类型安全的(您可以将Integer[]传递给它并将结果分配给String[]变量)。Arrays.copyOfRange(T[], int, int)返回T[]。您可能会将其与另一个带有Class参数的版本混淆。 - finnw
1
@finnw:另一种方法只是被重载了。我将它们合并了,但忘记删除第二个类型参数。现在已经修复了。 - Bozho

4
你也可以将字节缓冲区作为原始数组的视图来使用。

1
ByteBuffer skip4Bytes = ByteBuffer.wrap(bytes, 4, bytes.length - 4); - madx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接