example array java arrays bytearray nio bytebuffer

java - example - bytebuffer to byte array



Obtiene la matriz de bytes de un ByteBuffer en Java (6)

¿Es esta la forma recomendada de obtener los bytes del ByteBuffer?

ByteBuffer bb =.. byte[] b = new byte[bb.remaining()] bb.get(b, 0, b.length);


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.


Si uno no sabe nada sobre el estado interno del ByteBuffer dado (directo) y desea recuperar todo el contenido del búfer, puede usarlo:

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


Tan sencillo como eso

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


Tenga en cuenta que el bb.array () no respeta la posición de byte-buffers, y podría ser incluso peor si el bytebuffer en el que está trabajando es una porción de otro buffer.

Es decir

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"

Lo cual podría no ser lo que intentas hacer.

Si realmente no quieres copiar el byte-array, una solución podría ser utilizar el arrayOffset () + remaining () del buffer byte-buffer, pero esto solo funciona si la aplicación soporta index + length del byte-buffer. necesariamente.


depende de lo que quieras hacer.

Si lo que quieres es recuperar los bytes que quedan (entre posición y límite), entonces lo que tienes funcionará. También podrías hacer:

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

que es equivalente según los javadocs de ByteBuffer .


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