为了账号安全,请及时绑定邮箱和手机立即绑定

批量处理跟一个一个处理为啥读出来的数不一样

批量处理跟一个一个处理为啥读出来的数不一样

蛋黄酱0 2016-01-11 22:19:27
public class IOUtil {public static void printHex(String fileName)throws IOException{ int i=1; int b; FileInputStream in= new FileInputStream(fileName); while((b=in.read())!=-1){ if(b<=0xf){ System.out.print("0"); } System.out.print(Integer.toHexString(b)+" "); if(i++%10==0) System.out.println(); } in.close(); } public static void printHexByByteArray(String fileName) throws IOException{ FileInputStream in=new FileInputStream(fileName); byte[] buf=new byte[2000*1024]; int bytes=in.read(buf, 0, buf.length); int j=1; for(int i=0;i<bytes;i++){ if(buf[i]<=0xf){ System.out.print("0"); } System.out.print(Integer.toHexString(buf[i] & 0xff)+" "); if(j++%10==0){ System.out.println(); } } in.close(); }}用打断点的方式看 前者第14个数是192,后者是-64,导致控制台前者输出的是c0,后者输出0c0 。而且为啥每次正常运行控制程序 控制台的结果都不一样 感觉跟随机的似的...
查看完整描述

1 回答

已采纳
?
Its_forever

TA贡献361条经验 获得超328个赞

第一个问题:前者第14个数是192,192转化为二进制(11000000),后者是-64,转化为二进制(11000000),所以数据还是一样的。只是一个有符号位一个是无符号位。

你有这样两个判断:

if(b<=0xf){
System.out.print("0");
}
if(buf[i]<=0xf){
System.out.print("0");
}

还因为前者是b=192,大于0xf,所以不进入循环输出c0.

后者是-64,小于0xf,满足条件,进入循环,输出0,然后再输出c0.


第二个问题:控制台的结果

我没有遇到这个问题,你再好好看看呢,我觉得不会吧。


查看完整回答
2 反对 回复 2016-01-11
  • 蛋黄酱0
    蛋黄酱0
    非常感谢!
  • 蛋黄酱0
    蛋黄酱0
    第一个问题弄明白了,第二个问题可能是我读的文件的问题,换个小点的txt文件就正常了,没有正常显示的文件是我从电脑里随便找的文件,打断点一个一个数显示正常,一运行起来就不从头开始读了也不知道为啥..
  • 蛋黄酱0
    蛋黄酱0
    还想问个问题就是 read(byte[],0,len) 是怎么读出符号位的? read()是读一个字节填充int的低八位所以无符号,那批量处理是怎么读出符号的?假如我读一个汉字两个字节 read()分别读两个字节形成两个int都是正数,但是批量读不也应该读这两个字节吗,为啥就有可能读出负数了呢?
  • 1 回答
  • 0 关注
  • 1451 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信