作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚刚了解了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/
我是一名优秀的程序员,十分优秀!