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:嗽。为什么会这样呢?求达人讲解一下。
解决方案 »
- Java Swing的用户名和密码如何验证?
- 为什么我写了一个简单的socket服务端,一启动接收客户端就很占CPU了
- 如果减少项目开发中的BUG,采用什么方案减少
- 新手求助
- Applet上开三个线程,编译通过,但是运行时出错,提示Exception occurred during event dispatching:java.lang.NullPointerExceprion。
- 初级问题!这个生成的对象为什麽放这里?
- 谁知道java实现超链接?谢谢
- jbuilder 配置问题
- 刚学线程遇到了两个问题,一直想不通
- 发几道查错题大家一起找找错(不一定有错)
- 怎么让键盘事件在整个Frame上响应啊?
- 大家说说JAVA核心技术I、II怎么样
而你用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么?? (注意首位是符号位,为零表示正数)