Это рекомендуемый способ получить байты из ByteBuffer
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);
что эквивалентно javadocs ByteBuffer.
bb.capacity()
может быть равным,bb.remaining()
даже если резервный массив длиннее, поэтому вы не должны использовать их равенство в качестве проверкиbb.array()
правильности. СмотритеByteBuffer.slice()
.bb.slice().remaining()
. Таким образом, он выглядит как чистый дамп, не затрагивая исходный буфер.int
и использовать битовую маску:int unsigned_byte = b[k] & 0xff;
для некоторого значенияk
.ByteBuffer#clear
сначала позвонили ?Обратите внимание, что bb.array () не учитывает положение байтовых буферов и может быть еще хуже, если байтовый буфер, с которым вы работаете, является частью другого буфера.
Т.е.
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 () + Остающийся () байтового буфера, но это работает только в том случае, если приложение поддерживает индекс + длину байтовых буферов. потребности.
источник
Так просто, как, что
private static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) { byte[] bytesArray = new byte[byteBuffer.remaining()]; byteBuffer.get(bytesArray, 0, bytesArray.length); return bytesArray; }
источник
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);
источник
ByteBuffer.get(byte[])
возвращает aByteBuffer
data
переменной. Получатель возвращаетсяthis
, см. Его Javadoc.Это простой способ получить byte [], но часть смысла использования ByteBuffer состоит в том, чтобы избежать необходимости создавать byte []. Возможно, вы сможете получить все, что хотите, из байта [] прямо из ByteBuffer.
источник