Czy jest to zalecany sposób pobierania bajtów z ByteBuffer
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b, 0, b.length);
Odpowiedzi:
Zależy od tego, co chcesz zrobić.
Jeśli chcesz pobrać pozostałe bajty (między pozycją a limitem), wtedy to, co masz, zadziała. Możesz też po prostu zrobić:
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()];
bb.get(b);
co jest równoważne z javadocs ByteBuffer .
bb.slice().remaining()
. W ten sposób wygląda jak czysty zrzut bez dotykania oryginalnego bufora.
int
i użyć maski bitowej: int unsigned_byte = b[k] & 0xff;
dla jakiejś wartości k
.
ByteBuffer#clear
najpierw?
Zauważ, że bb.array () nie honoruje pozycji buforów bajtów i może być nawet gorsze, jeśli bufor bajtowy, nad którym pracujesz, jest fragmentem innego bufora.
To znaczy
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"
Co może nie być tym, co zamierzasz zrobić.
Jeśli naprawdę nie chcesz kopiować tablicy bajtów, rozwiązaniem może być użycie tablicy bufora bajtów () + pozostały (), ale działa to tylko wtedy, gdy aplikacja obsługuje indeks + długość buforów bajtów. wymagania.
Tak proste jak to
private static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) {
byte[] bytesArray = new byte[byteBuffer.remaining()];
byteBuffer.get(bytesArray, 0, bytesArray.length);
return bytesArray;
}
Jeśli nie wiemy nic o stanie wewnętrznym danego (bezpośredniego) ByteBuffera i chce się pobrać całą zawartość bufora, można to wykorzystać:
ByteBuffer byteBuffer = ...;
byte[] data = new byte[byteBuffer.capacity()];
((ByteBuffer) byteBuffer.duplicate().clear()).get(data);
ByteBuffer.get(byte[])
zwraca aByteBuffer
data
zmiennej. Getter powraca this
, zobacz jego Javadoc.
Jest to prosty sposób na uzyskanie bajtu [], ale częścią zastosowania ByteBuffer jest uniknięcie konieczności tworzenia bajtu []. Być może możesz uzyskać wszystko, co chcesz, z bajtu [] bezpośrednio z ByteBuffer.
bb.capacity()
może się to równaćbb.remaining()
nawet wtedy, gdy tablica podstawowa jest dłuższa, więc nie możesz używać ich równości jako testu, kiedybb.array()
jest poprawna. ZobaczByteBuffer.slice()
.