È questo il modo consigliato per ottenere i byte da ByteBuffer
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b, 0, b.length);
Risposte:
Dipende da cosa vuoi fare.
Se quello che vuoi è recuperare i byte rimanenti (tra posizione e limite), allora quello che hai funzionerà. Potresti anche fare semplicemente:
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()];
bb.get(b);
che è equivalente ai javadoc ByteBuffer .
bb.slice().remaining()
. In questo modo sembra un dump pulito senza toccare il buffer originale.
int
e utilizzare una maschera di bit: int unsigned_byte = b[k] & 0xff;
per un valore di k
.
ByteBuffer#clear
prima?
Nota che bb.array () non rispetta la posizione byte-buffer, e potrebbe essere anche peggio se il bytebuffer su cui stai lavorando è una fetta di qualche altro buffer.
Cioè
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"
Che potrebbe non essere quello che intendi fare.
Se davvero non vuoi copiare l'array di byte, una soluzione potrebbe essere quella di utilizzare arrayOffset () + residuo () del byte-buffer, ma funziona solo se l'applicazione supporta indice + lunghezza del byte-buffer esigenze.
Così semplice
private static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) {
byte[] bytesArray = new byte[byteBuffer.remaining()];
byteBuffer.get(bytesArray, 0, bytesArray.length);
return bytesArray;
}
Se non si sa nulla dello stato interno del ByteBuffer (diretto) dato e si desidera recuperare l'intero contenuto del buffer, è possibile utilizzare questo:
ByteBuffer byteBuffer = ...;
byte[] data = new byte[byteBuffer.capacity()];
((ByteBuffer) byteBuffer.duplicate().clear()).get(data);
ByteBuffer.get(byte[])
restituisce aByteBuffer
data
variabile. Il getter ritorna this
, guarda il suo Javadoc.
Questo è un modo semplice per ottenere un byte [], ma parte del punto dell'utilizzo di un ByteBuffer è evitare di dover creare un byte []. Forse puoi ottenere quello che vuoi ottenere dal byte [] direttamente dal ByteBuffer.
bb.capacity()
potrebbe essere ugualebb.remaining()
anche quando l'array di supporto è più lungo, quindi non devi usare la loro uguaglianza come test di quandobb.array()
è corretto. VediByteBuffer.slice()
.