Antworten:
Kommt darauf an, was du machen willst.
Wenn Sie die verbleibenden Bytes (zwischen Position und Limit) abrufen möchten, funktioniert das, was Sie haben. Sie könnten auch einfach tun:
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()];
bb.get(b);
Dies entspricht den ByteBuffer- Javadocs.
bb.slice().remaining()
. Auf diese Weise sieht es aus wie ein sauberer Speicherauszug, ohne den ursprünglichen Puffer zu berühren.
int
Bitmaske umwandeln und verwenden: int unsigned_byte = b[k] & 0xff;
für einen Wert von k
.
ByteBuffer#clear
zuerst aufrufen ?
Beachten Sie, dass bb.array () die Position der Bytepuffer nicht berücksichtigt und möglicherweise noch schlimmer ist, wenn der Bytebuffer, an dem Sie arbeiten, ein Teil eines anderen Puffers ist.
Dh
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"
Welches könnte nicht das sein, was Sie vorhaben.
Wenn Sie das Byte-Array wirklich nicht kopieren möchten, können Sie das ArrayOffset () + verbleibend () des Byte-Puffers verwenden. Dies funktioniert jedoch nur, wenn die Anwendung den Index + die Länge der Byte-Puffer unterstützt Bedürfnisse.
So einfach ist das
private static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) {
byte[] bytesArray = new byte[byteBuffer.remaining()];
byteBuffer.get(bytesArray, 0, bytesArray.length);
return bytesArray;
}
Wenn man nichts über den internen Zustand des gegebenen (direkten) ByteBuffers weiß und den gesamten Inhalt des Puffers abrufen möchte, kann dies verwendet werden:
ByteBuffer byteBuffer = ...;
byte[] data = new byte[byteBuffer.capacity()];
((ByteBuffer) byteBuffer.duplicate().clear()).get(data);
ByteBuffer.get(byte[])
gibt aByteBuffer
data
Variablen. Der Getter kehrt zurück this
, siehe Javadoc.
Dies ist eine einfache Möglichkeit, ein Byte [] abzurufen. Ein Teil der Verwendung eines ByteBuffers besteht jedoch darin, zu vermeiden, dass ein Byte [] erstellt werden muss. Vielleicht können Sie aus dem Byte [] direkt aus dem ByteBuffer alles bekommen, was Sie wollen.
bb.capacity()
möglicherweise auch dann gleich istbb.remaining()
, wenn das Backing-Array länger ist. Sie dürfen daher die Gleichheit nicht als Test für diebb.array()
Richtigkeit verwenden. SieheByteBuffer.slice()
.