È questo il modo consigliato per ottenere i byte dal ByteBufferOttiene array di byte da ByteBuffer in java
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b, 0, b.length);
È questo il modo consigliato per ottenere i byte dal ByteBufferOttiene array di byte da ByteBuffer in java
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b, 0, b.length);
Dipende da cosa si vuole fare.
Se quello che vuoi è quello di recuperare i byte che rimangono (tra la posizione e il limite), poi quello che hai funzionerà. Si potrebbe anche solo fare:
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b);
che è equivalente secondo le ByteBuffer javadocs.
Questo è un modo semplice per ottenere un byte [], ma parte del punto di usare un ByteBuffer è evitando di dover creare un byte []. Forse puoi ottenere quello che vuoi ottenere dal byte [] direttamente da ByteBuffer.
Ma spesso è necessario chiamare qualcosa (non nel proprio codice) che accetta un byte [], quindi la conversione non è facoltativa. –
Si noti che bb.array() non rispetta la posizione dei buffer di byte e potrebbe anche essere peggio se il bytebuffer su cui si sta lavorando è una porzione di un altro buffer.
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"
Quale potrebbe non essere quello che si intende fare.
Se davvero non si vuole copiare l'array di byte, una soluzione potrebbe essere quella di utilizzare l'array byteOffset() + remaining(), ma funziona solo se l'applicazione supporta l'indice + la lunghezza del buffer di byte di cui ha bisogno.
final ByteBuffer buffer;
if (buffer.hasArray()) {
final byte[] array = buffer.array();
final int arrayOffset = buffer.arrayOffset();
return Arrays.copyOfRange(array, arrayOffset + buffer.position(),
arrayOffset + buffer.limit());
}
// do something else
Se non si conosce nulla circa lo stato interno di un dato (diretto) ByteBuffer e vuole recuperare l'intero contenuto del buffer, questo può essere utilizzato:
ByteBuffer byteBuffer = ...;
byte[] data = new byte[byteBuffer.capacity()];
((ByteBuffer) byteBuffer.duplicate().clear()).get(data);
Semplice come che
private static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) {
byte[] bytesArray = new byte[byteBuffer.remaining()];
byteBuffer.get(bytesArray, 0, bytesArray.length);
return bytesArray;
}
corretta. E si noti che 'bb.capacity()' * potrebbe * uguale 'bb.remaining()', anche quando la matrice di supporto è più lungo, quindi non è necessario utilizzare la loro uguaglianza come test di quando 'bb.array()' è corretta . Vedi 'ByteBuffer.slice()'. – cdunn2001
@JasonS Ho una domanda qui in [ByteBuffer] (http://stackoverflow.com/questions/40798677/combine-multiple-fields-into-a-single-byte-array-using-bytebuffer). Volevo vedere se puoi dare una mano. – user1950349
Si noti che, per evitare di cambiare la posizione del buffer, ho usato 'bb.slice(). Remaining()'. In questo modo sembra un dump pulito senza toccare il buffer originale. –