public class Test {
    public static void main(String[] args){
    byte[] data=null;
    try {
data = "国".getBytes("Unicode");
    } catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
    }
for(int i=2;i<data.length;i++){
    System.out.println("\t"+data[i]);
}
int highByte=data[2];
int lowByte=data[3];
int charValue=highByte*256+lowByte;
char c=(char)charValue;
System.out.println("\tc:"+c);
    }
}根据推断,打印出来的应该是c:国,但实际上打印出来的却是c:嗽。为什么会这样呢?求达人讲解一下。

解决方案 »

  1.   

    国字的Unicode编码是56FD,对应到十进制是22269
    而你用highByte*256+lowByte计算的值是21927
    所以当然打印不出来"国"了
      

  2.   

    因为不是GBK编码data = "国".getBytes("GBK"); 应该用这个
      

  3.   

    是超过范围了..国字为56FD,即:86 253.. 而byte值为-127~127 转为整型取不到253..
      

  4.   

    把代码改成这样就可以了,与 0xff 做位与运算可以强制转换成 int 类型数据,
    就不存在楼主所说的问题了。int charValue = (highByte & 0xff) * 256 + (lowByte & 0xff);
      

  5.   

    加一个判断
    int highByte=data[2]; 
    int lowByte=data[3]; 
    if(highByte<0)
    highByte+=256;
    if(lowByte<0)
    lowByte+=256;
    int charValue=highByte*256+lowByte; 
    char c=(char)charValue; 
      

  6.   

    呵呵,java中没有了无符号整数,害死人啊.. 把楼主的代码改了一下,可以了,主要是用0x000000FF & 转成无符号整数:public class Test
    {
    public static void main(String[] args)
    {
    byte[] data=null;
    try
    {
    data = "国".getBytes("Unicode");
    }
    catch (Exception e)
    {
    // TODO: handle exception
    e.printStackTrace();
    }
    for(int i=2;i <data.length;i++)
    {
    //System.out.println("\t"+data[i]);
    System.out.println("\t" + (0x000000FF & data[i]));
    }
    //int highByte=data[2];
    //int lowByte=data[3];
    int highByte = 0x000000FF & data[2];
    int lowByte = 0x000000FF & data[3];
    int charValue=highByte*256+lowByte;
    char c=(char)charValue;
    System.out.println("\tc:"+c);
    }
    }
      

  7.   

    为什么一个byte数据与0xff位与运算的结果是一个int类型数据?
    譬如
    byte a=-3;
    byte b=a&0xff;
    由于-3在计算机内二进制表示为1111 1101,而0xff 二进制表示为1111 1111二者的位与结果应给还是1111 1101,所以b=1111 1101
    =十进制的-3.
    为什么实际上b却等于253呢?
      

  8.   

    晕..你不要在byte上面运算啊..最终的结果是int,4个字节,而不是byte这一个字节..所以byte首先强转成了int..
    也就是说-3的二进制数1111 1101要扩展成32位..根据符号数带符号扩展的原则..-3从byte扩展成int类型的值应为:
    1111 1111 1111 1111 1111 1111 1111 1101.
    (解释上面为什么要带符号扩展:因为,上面的二进制数都是补码..所以转成真值的话,一个字节的-3应为1000 0011..四个字节的-3应为1000 0000 0000 0000 0000 0000 0000 0011,这些值都是上面按位取反加一的结果)
    接下来..0xFF写全成四个字节的int值的话,应该是0x000000FF. 再与int型的-3 0xFFFFFFFD 做&操作看得到了什么??
    是0x000000FD.. 这个值是什么??不是就是253么?? (注意首位是符号位,为零表示正数)