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);
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.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()
.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ścik
.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.
źródło
Tak proste jak to
private static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) { byte[] bytesArray = new byte[byteBuffer.remaining()]; byteBuffer.get(bytesArray, 0, bytesArray.length); return bytesArray; }
źródło
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
źródło
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);
źródło
ByteBuffer.get(byte[])
zwraca aByteBuffer
data
zmiennej. Getter powracathis
, 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.
źródło