gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:17:32 24 4
gpt4 key购买 nike

我刚刚了解了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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com