2009-03-24 13 views

Respuesta

82

depende de lo que quiere hacer.

Si lo que quiere es recuperar los bytes que quedan (entre posición y límite), entonces lo que tenga funcionará. También puede simplemente hacer:

ByteBuffer bb =.. 

byte[] b = new byte[bb.remaining()] 
bb.get(b); 

lo que equivale según las ByteBuffer javadocs.

+5

Correcto. Y tenga en cuenta que 'bb.capacity()' * podría * ser igual a 'bb.remaining()' incluso cuando la matriz de respaldo sea más larga, por lo que no debe usar su igualdad como prueba cuando 'bb.array()' es correcto . Ver 'ByteBuffer.slice()'. – cdunn2001

+0

@JasonS Tengo una pregunta aquí en [bytebuffer] (http://stackoverflow.com/questions/40798677/combine-multiple-fields-into-a-single-byte-array-using-bytebuffer). Quería ver si puedes ayudar. – user1950349

+0

Tenga en cuenta que, para evitar cambiar la posición del búfer, utilicé 'bb.slice(). Remaining()'. De esta forma, parece un vertedero limpio sin tocar el buffer original. –

2

Esta es una forma simple de obtener un byte [], pero parte del uso de un ByteBuffer es evitar tener que crear un byte []. Quizás puedas obtener lo que quieras obtener del byte [] directamente de ByteBuffer.

+10

Pero a menudo tendrá que llamar a algo (no en su propio código) que toma un byte [], por lo que la conversión no es opcional. –

16

Tenga en cuenta que el bb.array() no respeta la posición de búferes de bytes, y podría ser incluso peor si el bytebuffer en el que está trabajando es una porción de otro búfer.

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" 

Que podría no ser lo que pretendes hacer.

Si realmente no desea copiar la matriz de bytes, una solución podría ser utilizar arrayOffset() + remaining(), pero esto solo funciona si la aplicación admite index + length of the byte-buffers que necesita.

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

Si uno no sabe nada sobre el estado interno de lo dado (Directo) ByteBuffer y quiere recuperar todo el contenido de la memoria intermedia, esto se puede utilizar:

ByteBuffer byteBuffer = ...; 
byte[] data = new byte[byteBuffer.capacity()]; 
((ByteBuffer) byteBuffer.duplicate().clear()).get(data); 
1

Tan simple como que

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