2013-08-01 33 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寫入字符類型作爲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如何像上面的結果一樣在ByteBuffer中轉換Float和Double類型?

非常感謝您提前。

+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)); 
} 

假設你有默認大端字節順序。

如果使用直接的ByteBuffer,它將使用不安全的類,該類將被視爲內部函數,並轉換爲機器代碼指令。即CPU完成這項工作。

相關問題