Подтвердить что ты не робот

Конвертировать LongBuffer/IntBuffer/ShortBuffer в ByteBuffer

Я знаю быстрый способ преобразования массива byte/short/int/long в ByteBuffer, а затем получить массив байтов. Например, чтобы преобразовать массив байтов в короткий массив, я могу сделать:

byte[] bArray = { 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 };

ByteBuffer bb = ByteBuffer.wrap(byteArray);
ShortBuffer sb = bb.asShortBuffer();
short[] shortArray = new short[byteArray.length / 2];
sb.get(shortArray);

создает короткий массив следующим образом: [256, 0, 0, 0, 256, 0, 0, 0].

Как я могу выполнить обратную операцию с помощью классов java.nio?

Теперь я делаю это:

shortArray[] = {256, 0, 0, 0, 256, 0, 0, 0};
ByteBuffer bb = ByteBuffer.allocate(shortArray.length * 2);
for (short s : shortArray) {
    bb.putShort(s);
}
return bb.array();

И я получаю исходный массив байтов [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]. Но я хочу использовать такой метод, как ShortBuffer.asByteBuffer(), а не ручной цикл для этого.

Я нашел запрос для Sun 2001 года, но они этого не приняли; - ((

4b9b3361

Ответ 1

Как насчет этого?

    bb.asShortBuffer().put(shortArray);

Затем bb содержит ваши данные.

Полный код:

public class Test {
    public static void main(final String args[]) {
        short[] arr = { 256, 0, 0, 0, 256, 0, 0, 0 };
        for (byte b : F(arr)) {
            System.out.print(b);
        }
    }

    public static byte[] F(short[] arr) {
        java.nio.ByteBuffer bb = java.nio.ByteBuffer.allocate(arr.length * 2);
        bb.asShortBuffer().put(arr);
        return bb.array(); // this returns the "raw" array, it shared and not copied!
    }
}

Ответ 2

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

В противном случае, кажется, единственный способ вернуть это - использовать отражения, чтобы получить поле bb.

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

Ответ 3

Ну, в объявлении

ShortBuffer sb = bb.asShortBuffer();

AFAIK, ваш ShortBuffer является просто представлением оригинала ByteBuffer. Таким образом, вы всегда можете получить доступ к исходной переменной ByteBuffer bb и просмотреть данные, измененные с помощью CharBuffer ссылки sb.

Документация для asCharBuffer говорит:

[...] Изменения в этом содержимом буфера будут видны в новом буфера и наоборот [...]