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:嗽。为什么会这样呢?求达人讲解一下。
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:嗽。为什么会这样呢?求达人讲解一下。
而你用highByte*256+lowByte计算的值是21927
所以当然打印不出来"国"了
就不存在楼主所说的问题了。int charValue = (highByte & 0xff) * 256 + (lowByte & 0xff);
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;
{
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);
}
}
譬如
byte a=-3;
byte b=a&0xff;
由于-3在计算机内二进制表示为1111 1101,而0xff 二进制表示为1111 1111二者的位与结果应给还是1111 1101,所以b=1111 1101
=十进制的-3.
为什么实际上b却等于253呢?
也就是说-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么?? (注意首位是符号位,为零表示正数)