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