2013-08-01 4 views
0

Я только что узнал о Java ByteBuffer, я немного смущен тем, как JVM хранит несколько типов данных в 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 байта, внутр типов как 4 байта, двойные типов, как 8 байт, и Поплавок типов, как 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 конвертировать Float и Double типы в ByteBuffer, как результат выше?

спасибо, что заранее.

+2

Это буфер BYTE. и диапазон байтов составляет от -128 до 127'. Поэтому он не может представлять '129' и будет переполняться до' -127'. –

+0

P.S. они JVM ничего не конвертируют, это только байтовые значения этих типов. –

ответ

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, который рассматривается как внутренне и превращается в инструкцию машинного кода. то есть процессор выполняет эту работу.

Смежные вопросы