Это рекомендуемый способ получить байты из ByteBuffer?
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b, 0, b.length);
Это рекомендуемый способ получить байты из 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.capacity()
может равняться bb.remaining()
, даже если резервный массив длиннее, поэтому вы не должны использовать их равенство в качестве проверки правильности bb.array()
. См. ByteBuffer.slice()
.
- person cdunn2001; 26.09.2012
bb.slice().remaining()
. Таким образом, он выглядит как чистый дамп, не касаясь исходного буфера.
- person Kyll; 21.01.2017
int
и использовать битовую маску: int unsigned_byte = b[k] & 0xff;
для некоторого значения k
.
- person Jason S; 15.04.2017
ByteBuffer#clear
?
- person Kenny Worden; 09.06.2018
Обратите внимание, что 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 () + оставшийся (), но это работает только в том случае, если приложение поддерживает индекс + длину байтовых буферов. потребности.
Так просто
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[])
возвращает ByteBuffer
- person pyb; 20.07.2018
data
. Геттер возвращает this
, см. его Javadoc.
- person Tomáš Myšík; 01.08.2018
Это простой способ получить byte[]
, но часть смысла использования ByteBuffer
заключается в том, чтобы избежать необходимости создавать byte[]
. Возможно, вы сможете получить все, что хотели, от byte[]
непосредственно от ByteBuffer
.