2017-11-25 250 views
0

我用ByteArrayOutputStream填充了一個字節數組。當我打印它時,輸出很混亂。我需要一些指導。從bytearrayoutputstream填充打印字節數組

這裏是我的代碼:

ByteArrayOutputStream bout = new ByteArrayOutputStream(); 
    DataOutputStream out = new DataOutputStream(bout); 
    try { 
     out.writeInt(150); 
     byte[] b = bout.toByteArray(); 
     System.out.println(Arrays.toString(b)); 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

這裏是我的輸出:

[0, 0, 0, -106] 

請幫

回答

0

150等於1001 0110 這是在字節的位-128項(最左邊的位)加2 + 4 + 16 = -106

0

你寫int 150至out。在二進制(具體地,two's complement),此整數看起來像這樣:

0000 0000 0000 0000 0000 0000 1001 0110 

每組8個比特是一個字節的數據,類似於byte數據類型。但是,與所有Java的整數類型(char除外)一樣,byte也被簽名。因此,即使最後一個byte的二進制值爲1001 0110,它也會顯示爲-106,這是二進制補碼中該字節的正確值。您可以用下列語句替換您的打印語句:

String[] strings = new String[b.length]; 
for (int i = 0; i < b.length; i++) { 
    strings[i] = Integer.toString(Byte.toUnsignedInt(b[i])); 
} 
System.out.println("[" + String.join(", ", strings) + "]"); 

將以無符號格式打印字節;每個人都會在[0,255]的範圍內。