Новый ByteBuffer со сдвинутыми байтами (Java)? - PullRequest
1 голос
/ 22 декабря 2010

У меня есть ByteBuffer, называемый буфер. Я хочу сгенерировать новый буфер, который содержит все его байты, которые идут от buffer.position () до конца буфера , за которым следует все байты от позиции 0 до buffer.position () - 1.

По сути, я хочу сместить байты в текущей позиции в начало буфера, доводя текущее начало до конца.

Для иллюстрации, если это мой ByteBuffer (где P - текущая позиция, а цифры 0-9 обозначают байтовые позиции):

 |0123456789|
     P

... тогда я бы хотел сформировать новый ByteBuffer, который выглядит следующим образом:

 |3456789012|
  P

Вот что я сейчас пытаюсь (и не работает):

 ByteBuffer tmpByteBuffer = buffer.slice();

 tmpByteBuffer.limit(buffer.capacity());

А вот ошибка (это из LogCat на Android - хотя я не думаю, что проблема связана с 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)

Может кто-нибудь сказать мне, что я делаю не так?

И есть ли лучший способ сделать это?

Спасибо за любую помощь в этом.

1 Ответ

5 голосов
/ 22 декабря 2010

Хм, я не понимаю, зачем вам устанавливать ограничение на нарезанный буфер. Это должно работать:

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)
...