Java 打印字节时出现println错误
我编写了下面的简单程序,用阿拉伯语输出hello:“سلام”,但它在控制台上的输出不正确:Java 打印字节时出现println错误,java,Java,我编写了下面的简单程序,用阿拉伯语输出hello:“سلام”,但它在控制台上的输出不正确: import static java.lang.Integer.toBinaryString; import java.util.Arrays; public class testOfPrintln { public static void main(String []strings){ String test="salam"; String test2="
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.在Java
中,byte
是一个有符号整数,其值范围为-128到127。如果需要无符号值,则强制转换为int
(在ANDing时隐式发生)和255
System.out.println(i++ + " -> " + (bb & 0xff));
Java的设计者将
字节
类型进行了签名,尽管99%的情况下这不是任何人想要的。所以它的范围是-128到+127,而不是0到255。以获得正确的值,并将其与0xFF(二进制中为8个1位)匹配。(上的Java规则规定,此表达式的结果将是int
类型,这就是0到255结果适合的原因,不会被压缩回一个字节并再次变为负数。)
加128是错误的。虽然结果将在0到255之间,但所有数字将具有不同的表示形式,并且
((字节)(bb+128))!=bb
。正确的方法是“和”它。
System.out.println(i++ + " -> " + (bb2 & 0xFF));