Новый ByteBuffer со сдвинутыми байтами (Java)?

1

У меня есть ByteBuffer, называемый buffer. Я хочу создать новый буфер, содержащий все его байты, которые идут от 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)

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

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

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

  • 0
    Примечание. В LogCat я проверил, что buffer.capacity () равен 10000 и что срез tmpByteBuffer имеет емкость и ограничение 3000, прежде чем исключение IllegalArgumentException выдается на tmpByteBuffer.limit (...)
Теги:
bytebuffer

1 ответ

5
Лучший ответ

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

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)
  • 0
    Спасибо - это работает очень хорошо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню