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

老师我有个问题请教一下,我的代码: 可以直接看加粗字体部分

/** 实现批量读取文件 参数为文件路径

* @param dir

* @throws IOException

*/

public static void readByBytes(String dir) throws IOException


{

FileInputStream in= new FileInputStream(dir);

byte[] temp=new byte[1024*5];

int count=0;

int j=1;

while((count=(in.read(temp, 0, temp.length)))!=-1)

{

for(int i=0;i<count;i++)

{

if(temp[i]<=0xf)

System.out.print("0");

System.out.print(Integer.toHexString(temp[i]&0xff)+" ");

if(j++%10==0)

System.out.println();

}

}

in.close();

}


问题:加粗那段是判断如果小于八位,就添加一个0在前面,可是输出的结果有点不太一样,

例如

0d8 0f6 0a1 7b 03 0f9 0d0 30 5c 094 

24 08e 47 0af 7a 63 36 0e 79 07 


为什么有的输出是三位,可是最神奇的是,基本上同样的代码,只不过在逐个字节读取里,输出就是正常的。

逐个字节读取代码如下: 

/**

* 实现逐个字节读取文件  参数为文件路径 

* @param dir

* @throws IOException

*/

public static void readByByte(String dir) throws IOException

{

FileInputStream in=new FileInputStream(dir);

int temp=0;

int j=1;

while((temp=in.read())!=-1)

{

if(temp<=0xf)

System.out.print("0");

System.out.print(Integer.toHexString(temp&0xff)+" ");

if(j++%10==0)

System.out.println();

}

in.close();

}


输出结果一切正常:

4d 08 73 0c 54 2e bf 29 35 43 

25 81 b2 98 a5 1d 4d 08 4c 4e 

77 53 94 1c d5 0d 12 8e 94 2f 

5a 42 63 24 05 4e 7b 50 ad eb 

40 27 72 5e 94 f5 8b 78 a1 8c 


求解 很纳闷

正在回答

3 回答

首先你可以查找相关的api可以看到,read()方法返回的是0-255之间的一个数,还有继续查阅相关api可以看到toHexString的时候,如果你要转化的这个数前24位全是0,则不会把0显示出来,而这里是0-255之间的数肯定不会,所以if(temp<=0xf)即可,你说为什么会有3位(在read(temp, 0, temp.length)方法中),你这样写就不会有了if((temp & 0xff) <= 0xf),具体的可以查阅相关的api,这里就不过多的解释了,加油~~~

1 回复 有任何疑惑可以回复我~

从文件读到的字节保存到字节数组是以byte数值形式保存的,比如读取文件中字节d8,保存到字节数组时d8成为有符号数值,对应的10进制是-72,所以在判断d8(-72)<=0xf(15)是成立的,这样就出现了0d8的输出形式。可以增加条件temp>=0,可以避免出现这样的情况。

1 回复 有任何疑惑可以回复我~
#1

小羊爱主

请教下,"保存到字节数组时d8成为有符号数字,对一个的10进制是-72",这个是如何得出的?可以给出具体的过程么?
2015-07-18 回复 有任何疑惑可以回复我~

0xf是十六进制的15,用二进制表示是1111,不是8位,是4位吧?

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号