¿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.
int
y usar una máscara de bits: int unsigned_byte = b[k] & 0xff;
para algún valor de k
.
ByteBuffer#clear
primero?
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
data
variable. 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()
.