¿Es esta la forma recomendada para obtener los bytes del ByteBufferObtiene el conjunto de bytes de una ByteBuffer en Java
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b, 0, b.length);
¿Es esta la forma recomendada para obtener los bytes del ByteBufferObtiene el conjunto de bytes de una ByteBuffer en Java
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b, 0, b.length);
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.
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.
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. –
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.
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
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);
Tan simple como que
private static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) {
byte[] bytesArray = new byte[byteBuffer.remaining()];
byteBuffer.get(bytesArray, 0, bytesArray.length);
return bytesArray;
}
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
@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
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. –