java - JVM如何将数据存储到ByteBuffer中?

标签 java bytebuffer

我刚刚了解了Java的ByteBuffer,我对JVM如何将多种数据类型存储到ByteBuffer中有点困惑。 这是代码:

public static void main(String[] args) {
    ByteBuffer BF1 = ByteBuffer.allocate(30);
    BF1.putChar('A');
    BF1.putChar('B');
    BF1.putInt(129);
    BF1.putDouble(0.98);
    BF1.putFloat(8.9f);

    byte[] BA1 = new byte[BF1.position()];
    BF1.position(0);
    BF1.get(BA1, 0, BA1.length);
    System.out.print("BA1 =");
    for(byte a: BA1)
         System.out.print(" " + a);
}

/*output
  BA1 = 0 65 0 66 0 0 0 -127 63 -17 92 40 -11 -62 -113 92 65 14 102 102 **/

据我了解,JVM将Char类型写为2个字节,int类型写为4个字节,double类型写为8个字节,Float类型写为4个字节。因此,ByteBuffer 中的输入值应该是:

A = 0 65,B = 0 66,192 = 0 0 0 -127,0.98 = 63 -17 92 40 -11 -62 -113 92,8.9f = 65 14 102 102

我的问题:

JVM如何将int 129转换为0 0 0 -127,为什么不写成0 0 0 129?那么JVM如何将ByteBuffer中的Float和Double类型转换为上面的结果呢?

提前非常感谢您。

最佳答案

最简单的方法是阅读代码。例如,要写入/读取它调用的 long

static void putLongB(ByteBuffer bb, int bi, long x) {
bb._put(bi + 0, long7(x));
bb._put(bi + 1, long6(x));
bb._put(bi + 2, long5(x));
bb._put(bi + 3, long4(x));
bb._put(bi + 4, long3(x));
bb._put(bi + 5, long2(x));
bb._put(bi + 6, long1(x));
bb._put(bi + 7, long0(x));
}

static long getLongB(long a) {
return makeLong(_get(a + 0),
        _get(a + 1),
        _get(a + 2),
        _get(a + 3),
        _get(a + 4),
        _get(a + 5),
        _get(a + 6),
        _get(a + 7));
}

假设您有默认的 Big Endian 字节顺序。

如果您使用直接 ByteBuffer,它将使用 Unsafe 类,该类被视为内在函数并转换为机器代码指令。即 CPU 完成工作。

关于java - JVM如何将数据存储到ByteBuffer中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17987790/

相关文章:

Oculus Rift 的 Java API?

java - 使用 key=String 和 value=ArrayList<Double> 创建一个映射

java - Netbeans 警告类型转换太强,但如果删除转换则会出现错误

java - ByteBuffer/IntBuffer/ShortBuffer Java 类速度快吗?

Java nio部分读取

java - 如何将 JavaScript 变量发送到 Java 小程序

java - 如何在 JSF 中使用 Facelets 创建左侧导航 Pane ?

Java - 识别更改类私有(private)成员的代码?

Java - 将 16 位有符号 pcm 音频数据数组转换为 double 组

Java NIO。为什么 Flip() 方法会破坏我的程序?