Разделение массива байтов

Можно ли получить определенные байты из массива байтов в java?

У меня есть массив байтов:

byte[] abc = new byte[512]; 

и я хочу иметь 3 разных массива байтов из этого массива.

  1. байт 0-127
  2. байт 128-255
  3. байт 256-511.

Я пробовал abc.read(byte[], offset,length), но это работает, только если я задаю смещение как 0, для любого другого значения выдается исключение IndexOutOfbounds.

Что я делаю неправильно?


person Tara Singh    schedule 12.02.2010    source источник
comment
Смещение находится в целевом массиве, а не в исходном.   -  person charlie    schedule 16.11.2012


Ответы (3)


Вы можете использовать Arrays.copyOfRange() для этого.

person tangens    schedule 12.02.2010
comment
Вау. Не знал об этом. - person Jonathan Feinberg; 12.02.2010
comment
@Jonathan Feinberg: это новое в Java 6. - person Powerlord; 12.02.2010
comment
@Tara обратите внимание, что конечный диапазон не должен совпадать с начальным диапазоном. т.е. если вы извлекаете из 0,127, то это должно быть Arrays.copyOfRange(record,0,128); - person Dead Programmer; 29.12.2010

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;
}
person Bozho    schedule 12.02.2010
comment
-1 это не то же самое, что стандартная версия. Это небезопасно для типов (вы можете передать ему Integer[] и присвоить результат переменной String[].) Arrays.copyOfRange(T[], int, int) возвращает T[]. Возможно, вы путаете ее с другой версией, которая принимает аргумент Class. - person finnw; 12.02.2010
comment
@finnw: другой метод просто перегружен. Я объединил их, но забыл удалить параметр 2-го типа. Теперь это исправлено. - person Bozho; 12.02.2010

Вы также можете использовать байтовые буферы в качестве представлений поверх исходного массива.

person Ron    schedule 12.02.2010