Нарезка байтовых массивов в Java

Я пытаюсь обрезать массив байтов, чтобы обрезать первую часть массива. Я использую ByteBuffer, но он не ведет себя так, как я ожидал.

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

Я ожидаю, что размер newArray будет равен 5, содержащий только последнюю часть моего ByteBuffer. Вместо этого возвращается полный массив байтов. Я понимаю, что это потому, что "буфер поддержки" одинаковый.

Как я могу нарезать только нужную часть массива?

EDIT: Добавлен контекст

Байты принимаются из сети. Буфер формируется следующим образом:

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

У меня уже есть функция, которая принимает байтовый массив в качестве параметра и вычисляет хэш SHA1. Я хочу, чтобы нарезать полный буфер, чтобы передавать только данные без ожидаемого хэша.

Ответы

Ответ 1

Вы можете использовать метод Arrays.copyOfRange. Например:

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

Ответ 2

Созданный ByteBuffer поддерживается этим массивом. Когда вы вызываете slice(), вы получаете фактическое представление этих данных:

Создает новый байтовый буфер, содержимое которого является общей подпоследовательностью этого содержимого буфера.

Таким образом, вызов array() для возвращаемого ByteBuffer возвращает массив подстановки целиком.

Чтобы извлечь все байты из этого представления, вы можете сделать:

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

Байты из этого представления будут скопированы в новый массив.

Изменить для добавления из комментариев ниже: Стоит отметить, что если все, что вам интересно делать, это копирование байтов из одного byte[] в другое byte[], нет оснований для использования ByteBuffer; просто скопируйте байты.