Вопрос по java, nio, arrays, bytearray – конвертировать LongBuffer / IntBuffer / ShortBuffer в ByteBuffer

14

Я знаю быстрый способ преобразования массива 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].

How can I do the inverse operation using 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 (), а не ручной цикл для этого.

Я нашелпросьба к солнцу 2001 года, но они этого не приняли; - ((

Стоит отметить, что в вашей ссылке Oracle говорит, что без поддержкиdirect ByteBuffer, предоставляющий такой «вид»; все еще потребует операции копирования при записи ввода / вывода. Это их причина не предоставлять этот метод. Luciano

Ваш Ответ

3   ответа
28

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

    bb.asShortBuffer().put(shortArray);

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

Full code:

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's shared and not copied!
    }
}
@morpheus Вопрос был о "преобразовании" не "кастинг".
это все !! благодарю вас! logoff
Вау, это так умно!
можно ли "разыграть" в java, т.е. конвертировать short [] в byte [] без дополнительного выделения памяти?
ByteBuffer.allocate (arr.length * 2) будет выделять длину * 2 байта, поэтому этот метод копирует данные, а не бросает short [] в byte []
1

Ну в декларации

ShortBuffer sb = bb.asShortBuffer();

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

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

[...] Changes to this buffer's content will be visible in the new buffer, and vice versa [...]

@logoff Ваш фрагмент кода вводит в заблуждение.
@ EdwinDalorzo, Человек, даже если этоdoes Работа,sb.toString().getBytes() очень некрасиво, если мы взламываемtoString как это...
это не работает. результат[106, 97, 118, 97, 46, 110, 105, 111, 46, 72, 101, 97, 112, 83, 104, 111, 114, 116, 66, 117, 102, 102, 101, 114, 91, 112, 111, 115, 61, 48, 32, 108, 105, 109, 61, 56, 32, 99, 97, 112, 61, 56, 93], это потому чтоsb.toString() вернутьjava.nio.HeapShortBuffer[pos=0 lim=8 cap=8] logoff
проблема в том, что у меня нет оригиналаByteBuffer... logoff
@logoff Как насчетByteBuffer.wrap(sb.toString().getBytes())?
1

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

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

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

Я хочу сказать, что вам часто нужно что-то вроде записи в файл или сокет. Если вы используете NIO, вы можете избежать превращения его в байтовый массив.
Использование прямого ByteBuffer быстрее, но я не могу получить доступ к резервному массиву позже. logoff
Да, это правда. Я делаю «странные вещи», только концептуальное подтверждение концепции. в любом случае, спасибо logoff
не в моем фрагменте, но мне это наконец-то нужно. В любом случае, ваш комментарий правильный, но мне нужен массив, хе-хе. logoff
Для чего вы используете резервный массив?

Похожие вопросы