Это рекомендуемый способ получить байт из ByteBufferВозвращает массив байтов из ByteBuffer в Java
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b, 0, b.length);
Это рекомендуемый способ получить байт из ByteBufferВозвращает массив байтов из ByteBuffer в Java
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b, 0, b.length);
Зависит то, что вы хотите сделать.
Если вы хотите получить оставшиеся байты (между позицией и лимитом), то то, что у вас есть, будет работать. Вы можете просто сделать:
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b);
что эквивалентно в соответствии с ByteBuffer Javadocs.
Это простой способ получить байт [], но часть использования ByteBuffer заключается в том, чтобы не создавать байт []. Возможно, вы можете получить все, что хотите получить от байт [], непосредственно из ByteBuffer.
Но часто вам нужно вызывать что-то (не в вашем собственном коде), которое принимает байт [], поэтому преобразование не является необязательным. –
Обратите внимание, что bb.array() не соблюдает положение байтовых буферов и может быть еще хуже, если байтбуфер, над которым вы работаете, является срезом некоторого другого буфера.
I.e.
byte[] test = "Hello World".getBytes("Latin1");
ByteBuffer b1 = ByteBuffer.wrap(test);
byte[] hello = new byte[6];
b1.get(hello); // "Hello "
ByteBuffer b2 = b1.slice(); // position = 0, string = "World"
byte[] tooLong = b2.array(); // Will NOT be "World", but will be "Hello World".
byte[] world = new byte[5];
b2.get(world); // world = "World"
Возможно, это не то, что вы намереваетесь сделать.
Если вы действительно не хотите копировать байт-массив, то работать с массивом может быть использование arrayOffset() + остатка() байтового буфера, но это работает только в том случае, если приложение поддерживает индекс + длину байт-буферов, в которых он нуждается.
final ByteBuffer buffer;
if (buffer.hasArray()) {
final byte[] array = buffer.array();
final int arrayOffset = buffer.arrayOffset();
return Arrays.copyOfRange(array, arrayOffset + buffer.position(),
arrayOffset + buffer.limit());
}
// do something else
Если один ничего не знает о внутреннем состоянии заданного (Direct) не знаю ByteBuffer и хочет получить все содержимое буфера, это может быть использовано:
ByteBuffer byteBuffer = ...;
byte[] data = new byte[byteBuffer.capacity()];
((ByteBuffer) byteBuffer.duplicate().clear()).get(data);
Как просто что
private static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) {
byte[] bytesArray = new byte[byteBuffer.remaining()];
byteBuffer.get(bytesArray, 0, bytesArray.length);
return bytesArray;
}
Исправить. И обратите внимание, что 'bb.capacity()' * может * равно 'bb.remaining()', даже если массив поддержки больше, поэтому вы не должны использовать их равенство в качестве теста, когда 'bb.array()' правильный , См. 'ByteBuffer.slice()'. – cdunn2001
@JasonS У меня есть вопрос здесь [bytebuffer] (http://stackoverflow.com/questions/40798677/combine-multiple-fields-into-a-single-byte-array-using-bytebuffer). Хотел посмотреть, сможете ли вы помочь. – user1950349
Обратите внимание, что во избежание изменения положения буфера я использовал 'bb.slice(). Остальные()'. Таким образом, он выглядит как чистый дамп, не касаясь исходного буфера. –