Це рекомендований спосіб отримати байти з 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);
що еквівалентно згідно з ByteBuffer javadocs.
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;
}
Якщо хтось нічого не знає про внутрішній стан заданого (Прямого) ByteBuffer і хоче отримати весь вміст буфера, це можна використати:
ByteBuffer byteBuffer = ...;
byte[] data = new byte[byteBuffer.capacity()];
((ByteBuffer) byteBuffer.duplicate().clear()).get(data);
ByteBuffer.get(byte[])
повертає aByteBuffer
data
змінну. Геттер повертається this
, див. Його Javadoc.
Це простий спосіб отримати байт [], але частиною суті використання ByteBuffer є уникнення необхідності створювати байт []. Можливо, ви можете отримати все, що хотіли отримати з байта [], безпосередньо з ByteBuffer.
bb.capacity()
може дорівнюватиbb.remaining()
навіть тоді, коли масив підкладки довший, тому ви не повинні використовувати їх рівність як перевірку того, колиbb.array()
правильно. ДивByteBuffer.slice()
.