亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

老師我有個問題請教一下,我的代碼: 可以直接看加粗字體部分

/** 實現批量讀取文件 參數為文件路徑

* @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的輸出形式??梢栽黾訔l件temp>=0,可以避免出現這樣的情況。

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

小羊愛主

請教下,"保存到字節數組時d8成為有符號數字,對一個的10進制是-72",這個是如何得出的?可以給出具體的過程么?
2015-07-18 回復 有任何疑惑可以回復我~

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

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

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號