Respostas:
Depende do que você quer fazer.
Se o que você quer é recuperar os bytes restantes (entre a posição e o limite), então o que você tem vai funcionar. Você também pode simplesmente fazer:
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()];
bb.get(b);
que é equivalente de acordo com os javadocs ByteBuffer .
bb.slice().remaining()
. Dessa forma, parece um dump limpo sem tocar no buffer original.
int
e usar uma máscara de bits: int unsigned_byte = b[k] & 0xff;
para algum valor de k
.
ByteBuffer#clear
primeiro?
Observe que bb.array () não respeita a posição dos buffers de bytes e pode ser ainda pior se o bytebuffer em que você está trabalhando for uma fatia de algum outro buffer.
Ie
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"
O que pode não ser o que você pretende fazer.
Se você realmente não deseja copiar o byte-array, uma solução alternativa pode ser usar o arrayOffset () + restante () do buffer de bytes, mas isso só funciona se o aplicativo suportar índice + comprimento dos buffers de bytes necessidades.
Tão simples como isso
private static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) {
byte[] bytesArray = new byte[byteBuffer.remaining()];
byteBuffer.get(bytesArray, 0, bytesArray.length);
return bytesArray;
}
Se alguém não souber nada sobre o estado interno do ByteBuffer (direto) fornecido e quiser recuperar todo o conteúdo do buffer, isso pode ser usado:
ByteBuffer byteBuffer = ...;
byte[] data = new byte[byteBuffer.capacity()];
((ByteBuffer) byteBuffer.duplicate().clear()).get(data);
ByteBuffer.get(byte[])
retorna aByteBuffer
data
variável. O getter retorna this
, consulte seu Javadoc.
Esta é uma maneira simples de obter um byte [], mas parte do objetivo de usar um ByteBuffer é evitar a criação de um byte []. Talvez você possa obter o que deseja obter do byte [] diretamente do ByteBuffer.
bb.capacity()
pode ser igualbb.remaining()
mesmo quando a matriz de apoio é mais longa, portanto, você não deve usar sua igualdade como um teste de quandobb.array()
está correto. VejaByteBuffer.slice()
.