1

buffer と呼ばれる ByteBuffer があります。buffer.position() からバッファの最後までのすべてのバイトに続いて、位置 0 から buffer.position()-1 までのすべてのバイトを含む新しいバッファを生成したいと考えています。

基本的に、現在の先頭を最後に移動しながら、現在の位置のバイトをバッファの先頭にシフトしたいと考えています。

説明のために、これが私の ByteBuffer の場合 (Pは現在の位置で、数字0-9はバイト位置を示します):

 |0123456789|
     P

...次に、次のような新しい ByteBuffer を作成したいと思います。

 |3456789012|
  P

これが私がこれまでに試したことです(そして機能していません):

 ByteBuffer tmpByteBuffer = buffer.slice();

 tmpByteBuffer.limit(buffer.capacity());

そして、ここにエラーがあります(これはAndroidのLogCatからのものです-問題はAndroid固有ではないと思いますが):

 12-22 03:49:44.303: ERROR/AndroidRuntime(10399): Uncaught handler: thread Thread-11 exiting due to uncaught exception
 12-22 03:49:44.313: ERROR/AndroidRuntime(10399): java.lang.IllegalArgumentException
 12-22 03:49:44.313: ERROR/AndroidRuntime(10399):     at java.nio.Buffer.limit(Buffer.java:239)
 12-22 03:49:44.313: ERROR/AndroidRuntime(10399):     at com.chaimp.audiolistener.AudioListener.captureSamples(AudioListener.java:175)
 12-22 03:49:44.313: ERROR/AndroidRuntime(10399):     at com.chaimp.precisiontuner.PrecisionTuner$1.run(PrecisionTuner.java:28)
 12-22 03:49:44.313: ERROR/AndroidRuntime(10399):     at java.lang.Thread.run(Thread.java:1096)

誰が私が間違っているのか教えてもらえますか?

そして、これを行うためのより良い方法はありますか?

これについて何か助けてくれてありがとう。

4

1 に答える 1

5

うーん、スライスされたバッファに制限を設定する必要がある理由がわかりません。これはうまくいくはずです:

ByteBuffer originalBuffer = getOriginalBuffer();
ByteBuffer newBuffer = ByteBuffer.allocate(originalBuffer.limit());

ByteBuffer slicedBuffer = originalBuffer.slice(); //Will be from pos to end
originalBuffer.flip(); //Will be from 0 to pos

newBuffer.put(slicedBuffer)
newBuffer.put(originalBuffer)
于 2010-12-22T09:19:04.047 に答える