Java 打印字节时出现println错误

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="

我编写了下面的简单程序,用阿拉伯语输出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="سلام";//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));