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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

批量處理跟一個一個處理為啥讀出來的數不一樣

批量處理跟一個一個處理為啥讀出來的數不一樣

蛋黃醬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 關注
  • 1498 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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