2013-07-21 39 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));