2013-08-05 33 views
1

我正在研究一個Java程序,我需要將short轉換爲兩個字節(然後將其打包到數據包中)。我使用ByteBuffer來執行轉換,它似乎工作,但我看到一些明顯的字節填充,我不太明白。Java中的ByteBuffer字節填充

下面是一個簡單的例子,我寫道:

import java.lang.*; 
import java.io.*; 
import java.nio.ByteOrder; 
import java.nio.ByteBuffer; 

public class Test { 
    public static void main(String args[]) { 
     short i = 27015; 
     String s = Integer.toHexString(i); 

     System.out.println("i = " + i); 
     System.out.println("s = " + s); 
     System.out.println("---"); 

     ByteBuffer b = ByteBuffer.allocate(2); 
     b.order(ByteOrder.BIG_ENDIAN); 
     b.putShort(i); 

     System.out.printf("0x%H\n", b.getShort(0)); 
     System.out.println("---"); 

     byte[] a = b.array(); 

     for(int j = 0; j < a.length; j++) 
      System.out.printf("a[" + j + "] = 0x%H\n", a[j]); 

     System.exit(0); 
    } 
} 

此程序產生以下輸出:

i = 27015 
s = 6987 
--- 
0x6987 
--- 
a[0] = 0x69 
a[1] = 0xFFFFFF87 

ByteBuffer轉換爲byte陣列,爲什麼爲0xFF填充第二字節?看起來陣列的第二個元素應該是0x87而不是0xFFFFFF87。我錯過了什麼嗎?

謝謝!

+0

字節'0x87'是負數,它的高位被設置。轉換爲int另一個得到0xFFFFFF87,一個負數。 –

回答

1

當ByteBuffer轉換爲字節數組時,爲什麼第二個字節用0xFF填充?

當您使用%H進行打印時,它會將該字節轉換爲int。它的ID不是ByteBuffer中的字節,而是它的打印方式。我建議改用Byte.toHexString(a[j])

+0

感謝您將我的困惑凝聚成一個更簡潔的問題,並感謝您的回答。這是完全合理的。我從來沒有想到這個問題出現在'printf()'轉換中。 – Dave

+0

當我測試失敗時,至少有50%的時間是由於測試出現問題而導致的。 –

0

試試這個:

for (int j = 0; j < a.length; j++) 
    System.out.printf("a[" + j + "] = 0x%H\n", ((int) a[j]) & 0xFF); 

& 0xFF操作將削減最高的三個字節,被轉換爲int後創建。

供參考:((int) a[j]) & 0xFF可以寫成a[j] & 0xFF並將編譯完全相同。但是,我最初寫這個是爲了澄清發生的事情。

+0

感謝您的建議。我試過了,這確實使輸出更清晰。 – Dave