带有移位字节的新 ByteBuffer (Java)?

Posted

技术标签:

【中文标题】带有移位字节的新 ByteBuffer (Java)?【英文标题】:New ByteBuffer with Shifted Bytes (Java)? 【发布时间】:2010-12-22 09:05:04 【问题描述】:

我有一个称为缓冲区的 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)

谁能告诉我我做错了什么?

还有,有没有更好的方法来做到这一点?

感谢您对此提供的任何帮助。

【问题讨论】:

注意:我已经在 LogCat 中验证了 buffer.capacity() 为 10,000,并且在 tmpByteBuffer.limit(...) 上抛出 IllegalArgumentException 之前,tmpByteBuffer 切片的容量和限制为 3,000 /跨度> 【参考方案1】:

嗯,我不明白你为什么需要对切片缓冲区设置限制。这应该有效:

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)

【讨论】:

以上是关于带有移位字节的新 ByteBuffer (Java)?的主要内容,如果未能解决你的问题,请参考以下文章

基于类似于来自java的ByteBuffer的字节集合

将 Java 位图打包到 ByteBuffer 中 - 字节顺序与像素格式和字节序不匹配(ARM)

Java bytebuffer 将三个字节转换为 int

将 C 字节数组解析为 Java ByteBuffer。

比较 ByteBuffer 中的字节

Java 移位字节返回意外结果