¿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);
Respuestas:
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 puedes hacer:
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()];
bb.get(b);
que es equivalente según los javadocs ByteBuffer .
bb.slice().remaining(). De esa manera, parece un vertedero limpio sin tocar el búfer original.
inty usar una máscara de bits: int unsigned_byte = b[k] & 0xff;para algún valor de k.
ByteBuffer#clearprimero?
Tenga en cuenta que bb.array () no respeta la posición de los búferes de bytes y podría ser incluso peor si el búfer de bytes en el que está trabajando es una porción de algún otro búfer.
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 pretendes hacer.
Si realmente no desea copiar la matriz de bytes, una solución podría ser usar la matrizOffset () + restante () del búfer de bytes, pero esto solo funciona si la aplicación admite índice + longitud de los búferes de bytes necesidades.
Tan sencillo como eso
private static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) {
byte[] bytesArray = new byte[byteBuffer.remaining()];
byteBuffer.get(bytesArray, 0, bytesArray.length);
return bytesArray;
}
Si uno no sabe nada sobre el estado interno del ByteBuffer (Directo) dado y desea recuperar todo el contenido del búfer, se puede utilizar:
ByteBuffer byteBuffer = ...;
byte[] data = new byte[byteBuffer.capacity()];
((ByteBuffer) byteBuffer.duplicate().clear()).get(data);
ByteBuffer.get(byte[])devuelve aByteBuffer
datavariable. El captador regresa this, vea su Javadoc.
Esta es una forma sencilla de obtener un byte [], pero parte del objetivo de usar un ByteBuffer es evitar tener que crear un byte []. Quizás pueda obtener lo que quiera obtener del byte [] directamente del ByteBuffer.
bb.capacity()podría ser igualbb.remaining()incluso cuando la matriz de respaldo sea más larga, por lo que no debe usar su igualdad como una prueba de cuándobb.array()es correcta. VerByteBuffer.slice().