Ist dies der empfohlene Weg, um den Bytes aus dem ByteBufferRuft Byte-Array von einem ByteBuffer in Java
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b, 0, b.length);
Ist dies der empfohlene Weg, um den Bytes aus dem ByteBufferRuft Byte-Array von einem ByteBuffer in Java
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b, 0, b.length);
Hängt zu bekommen, was Sie tun mögen.
Wenn Sie die verbleibenden Bytes abrufen möchten (zwischen Position und Limit), dann wird das funktionieren, was Sie haben. Sie könnten auch einfach tun:
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b);
, die gemäß den ByteBuffer javadocs entspricht.
Dies ist ein einfacher Weg, um ein Byte [] zu erhalten, aber ein Teil des Punktes der Verwendung eines ByteBuffers ist die Vermeidung eines Bytes []. Vielleicht können Sie aus dem Byte [] direkt aus dem ByteBuffer holen, was Sie wollen.
Aber oft müssen Sie etwas (nicht in Ihrem eigenen Code) aufrufen, das ein Byte [] benötigt, daher ist die Konvertierung nicht optional. –
Beachten Sie, dass die bb.array() die Byte-Puffer-Position nicht berücksichtigt, und möglicherweise noch schlechter, wenn der Bytepuffer, den Sie bearbeiten, ein Stück eines anderen Puffers ist.
I.e.
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"
Was möglicherweise nicht das ist, was Sie beabsichtigen zu tun.
Wenn Sie wirklich nicht wollen, das Byte-Array zu kopieren, könnte eine Umgehung aroundOffset() + resting() des Byte-Puffers sein, aber das funktioniert nur, wenn die Anwendung index + length des Byte-Puffer benötigt es.
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
Wenn man nichts über den internen Zustand der gegebenen (Direct) weiß ByteBuffer und will den ganzen Inhalt des Puffers abzurufen, kann diese verwendet werden:
ByteBuffer byteBuffer = ...;
byte[] data = new byte[byteBuffer.capacity()];
((ByteBuffer) byteBuffer.duplicate().clear()).get(data);
So einfach wie dass
private static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) {
byte[] bytesArray = new byte[byteBuffer.remaining()];
byteBuffer.get(bytesArray, 0, bytesArray.length);
return bytesArray;
}
Korrekt. Und beachte, dass 'bb.capacity()' * * bb.remaining() 'auch dann gleich sein kann, wenn das backing-Array länger ist, also musst du ihre Gleichheit nicht als Test verwenden, wenn' bb.array() 'korrekt ist . Siehe 'ByteBuffer.slice()'. – cdunn2001
@JasonS Ich habe eine Frage hier auf [bytebuffer] (http://stackoverflow.com/questions/40798677/combine-multiple-fields-into-a-single-byte-array-using-bytebuffer). Wollte sehen, ob du helfen kannst. – user1950349
Beachten Sie, dass ich 'bb.slice(). Resting()' verwendete, um die Position des Puffers zu ändern. Auf diese Weise sieht es wie ein sauberer Speicher aus, ohne den ursprünglichen Puffer zu berühren. –