回答:
あなたが何をしたいかに依存します。
残りのバイト(位置と制限の間)を取得する必要がある場合は、使用しているものが機能します。次のようにすることもできます:
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()];
bb.get(b);
これは、ByteBuffer javadocs と同等です。
bb.slice().remaining()
。こうすることで、元のバッファに触れずにクリーンダンプのように見えます。
int
とビットマスクを使用します。int unsigned_byte = b[k] & 0xff;
いくつかの値についてk
。
ByteBuffer#clear
最初に呼び出しますか?
bb.array()はバイトバッファーの位置を考慮しないため、作業中のバイトバッファーが他のバッファーのスライスである場合はさらに悪いことに注意してください。
すなわち
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"
それはあなたがやろうとしていることではないかもしれません。
バイト配列をコピーしたくない場合は、バイトバッファーのarrayOffset()+残り()を使用することで回避できますが、これは、アプリケーションがバイトバッファーのインデックス+長さをサポートしている場合にのみ機能します。ニーズ。
指定された(Direct)ByteBufferの内部状態について何も知らず、バッファのコンテンツ全体を取得したい場合、これを使用できます。
ByteBuffer byteBuffer = ...;
byte[] data = new byte[byteBuffer.capacity()];
((ByteBuffer) byteBuffer.duplicate().clear()).get(data);
ByteBuffer.get(byte[])
リターンByteBuffer
data
変数に含まれます。ゲッターはを返しますthis
。Javadocを参照してください。
これはbyte []を取得する簡単な方法ですが、ByteBufferを使用するポイントの一部は、byte []を作成する必要がないことです。おそらく、ByteBufferから直接byte []から取得したいものを何でも取得できます。
bb.capacity()
かをbb.remaining()
テストするためにそれらの等価性を使用しないでくださいbb.array()
。を参照してくださいByteBuffer.slice()
。