2009-03-24 14 views

risposta

82

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.

+5

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

+0

@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

+0

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. –

2

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.

+10

Ma spesso è necessario chiamare qualcosa (non nel proprio codice) che accetta un byte [], quindi la conversione non è facoltativa. –

16

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.

3
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 
3

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); 
1

Semplice come che

private static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) { 
    byte[] bytesArray = new byte[byteBuffer.remaining()]; 
    byteBuffer.get(bytesArray, 0, bytesArray.length); 
    return bytesArray; 
}