Это рекомендуемый способ получить байты из 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.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;
}
Если кто-то ничего не знает о внутреннем состоянии данного (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.
bb.capacity()
может быть равным,bb.remaining()
даже если резервный массив длиннее, поэтому вы не должны использовать их равенство в качестве проверкиbb.array()
правильности. СмотритеByteBuffer.slice()
.