2013-07-21 37 views
3

我已經寫了簡單的程序如下輸出打招呼阿拉伯語:「سلام」,但它在控制檯輸出不正確:的println錯誤打印時字節

import static java.lang.Integer.toBinaryString; 

import java.util.Arrays; 


public class testOfPrintln { 
    public static void main(String []strings){ 
     String test="salam"; 
     String test2="سلام";//unicode , arabic 
     byte []strbytes=test.getBytes(); 
     int i=1; 
     for(byte bb:strbytes) 
      System.out.println(i++ + " -> " + bb); 
     byte []strbytes2=test2.getBytes(); 
     i=1; 
     for(byte bb2:strbytes2){ 
      System.out.println(i++ + " -> " + bb2); 
     } 
    } 

} 

輸出:

1 -> 115 
2 -> 97 
3 -> 108 
4 -> 97 
5 -> 109 
1 -> -40 
2 -> -77 
3 -> -39 
4 -> -124 
5 -> -40 
6 -> -89 
7 -> -39 
8 -> -123 

爲什麼在字節前有一個「 - 」字符?例如:-123 tnx。

回答

2

在Java byte簽署整數值的範圍從-128到127,如果你想無符號值,轉換爲int(隱含發生時取與)和並用255

System.out.println(i++ + " -> " + (bb & 0xff)); 
+1

添加128是錯的。雖然結果將在0到255的範圍內,但所有數字將具有不同的表示形式,並且「((byte)(bb + 128))!!= bb」。正確的方法是'和'它。 – Boann

+0

你是對的。我會相應地改變我的答案。 –

1

Java的設計者製作了byte類型簽名,儘管99%的時間並不是人們想要的。所以它的範圍是-128到+127,而不是0到255.爲了得到正確的值,並且它與0xFF(在二進制中是八個1位)。 (上binary numeric promotion Java的規則說,這個表達式的結果將是int類型,這就是爲什麼在0至255的結果千篇一律,沒有被壓扁回一個字節,並再次成爲負面的。):

System.out.println(i++ + " -> " + (bb2 & 0xFF));