java - 在这种情况下可以替代 Java ByteBuffer 吗?

标签 java byte arrays bytebuffer

通过使用 Android Profiler 工具,我发现我在代码的性能关键区域使用了大量 ByteBuffer。我一直致力于尽可能优化最大的性能命中(尚未被迫进行循环优化之类的事情),并且 ByteBuffer 代码看起来可以轻松地用另一个/更好的解决方案替换。

问题:从位于 ByteBuffer 流中的 4 个连续字节获取 int,该字节可以是任意长度,当前已完成(如下所示,特别是//<<< 部分),带有临时值ByteBuffer 并抓取所需的字节以形成 int。有没有更简单的流程?

private int peekStreamData(ByteBuffer stream, int count) {
    int data = 0;
    int stream_field = streamField;
    int stream_field_bit_index = streamFieldBitIndex;
    byte[] streamArr = stream.array();
    ByteBuffer bb = ByteBuffer.allocate(4);
    while (count > (32 - stream_field_bit_index) && streamIndex < (imageStream.capacity() >> 2)) {
        data = (data << (32 - stream_field_bit_index)) | ( stream_field >>> stream_field_bit_index);
        count -= 32 - stream_field_bit_index;

        bb.put(0,streamArr[streamIndex * 4 + 3]);  //<<<
        bb.put(1,streamArr[streamIndex * 4 + 2]);  //<<<
        bb.put(2,streamArr[streamIndex * 4 + 1]);  //<<<
        bb.put(3,streamArr[streamIndex * 4 + 0]);  //<<<
        stream_field = bb.getInt();                //<<<        
        stream_field_bit_index = 0;
    }
    if (count > 0)
        data = (data << count) | (stream_field >>> (32 - count));
    return data;//data;
}

如有错误,欢迎指出。直到最近我才使用过 ByteBuffers,并且很想学习。

最佳答案

这些行

    bb.put(0,streamArr[streamIndex * 4 + 3]);  //<<<
    bb.put(1,streamArr[streamIndex * 4 + 2]);  //<<<
    bb.put(2,streamArr[streamIndex * 4 + 1]);  //<<<
    bb.put(3,streamArr[streamIndex * 4 + 0]);  //<<<
    stream_field = bb.getInt();                //<<<

可以用第二个 ByteBuffer 替换为以下内容。

    stream_field = stream.getInt(streamIndex * 4);

我怀疑许多其他代码可以简化,但我不清楚它的作用或为什么甚至有一个循环来执行它。

关于java - 在这种情况下可以替代 Java ByteBuffer 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6631010/

相关文章:

加载外部 Jar(插件架构)时 JavaFX 样式丢失

Java如何迭代递归地查找链表中的值

java - 使用 spring boot 从 Secret Manager GCP 获取值

javascript - 日期检查 - 无法从未定义中读取属性 "0"

使用 Wildfly 8、Java 1.8.0_45 和 Active Directory 的 Java SSO

c - 解析字节 (C Windows)

javascript - 将 node.js 中的字节数组发送到服务器

c# - 如何读取字节数组中的每第三位

mysql - 如何在Golang中使用另一个数组的ID填充数组

java - ClassCastException : java. lang.String 无法转换为 Ljava.lang.String