0

我刚刚了解了 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类型?

非常感谢您提前。

4

1 回答 1

1

最简单的方法是阅读代码。例如写/读一个长它调用

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 完成工作。

于 2013-08-01T07:46:04.920 回答