課程
/后端開發(fā)
/Java
/文件傳輸基礎(chǔ)——Java IO流
代碼有問題,求解啊,不知道為什么出錯
2016-11-28
源自:文件傳輸基礎(chǔ)——Java IO流 4-2
正在回答
凌晨來回答問題。
首先我們要弄明白,對于一個buf[i], 我們在什么情況下需要在輸出之前補0,什么時候不需要補0.答案很清楚,如果它的高四位都是0,那么我們需要補,否則不需要。那么問題來了,怎么判斷呢?
老師的代碼是用buf[i] <= 0xf,可是代碼結(jié)果不正確,會出現(xiàn)錯誤補0,也就是三個數(shù)字一起的情況。如果buf[i] == 0xff, 那么按程序是需要補0,因為作為一個byte,0xff實際上等于-1, 那么自然也小于0xf,因為0xf代表15.這就是出錯的問題。
if判定語句改為((buf&oxff)<=oxf)之后,實際上結(jié)果就正確了。因為在Java中整數(shù)默認是int,也就是4個字節(jié)。因為有buf[i] & 0xff, 注意這里0xff 是4個字節(jié)的int類型,那么計算之前會把buf[i]自動進行類型轉(zhuǎn)換,結(jié)果也是int類型,所以我們最終的到的結(jié)果是24位0加上原先的8位buf[i]。這時候的結(jié)果已經(jīng)絕對是個正數(shù),此時要判斷buf[i]高4位是否有1,就看他和0xf的大小就行了。這里要設(shè)計一點補碼的知識,我們還是以buf[i] == 0xff為例:
((buf&oxff)<=oxf)之后的結(jié)果是0x000000ff, 顯然是大于0xf,所以沒有補0.
實際上,我們也可以這么判斷:buf[i] & 0xf0 == 0;這樣的結(jié)果會保留buf[i]的高四位,其他位都是0,比較容易理解。
指尖繁華 提問者
未卜先知
i不系之舟i
if判定語句改為((buf&oxff)<=oxf);之后輸出都是兩位,這個不知原因,跪求求大神解惑???!
還有,int b=in.read()則沒有以上問題;
或許不是錯,但是為啥有三個數(shù)字一組的,這個不太懂。
舉報
為您介紹IO流的使用,以及對象的序列化和反序列化的內(nèi)容
1 回答FileInputStream和FileOutputStream
1 回答這個FileInputStream in = new FileInputStream(file)為什么能這么寫呢
1 回答randomaccessfile和fileinputstream
2 回答FileInputStream in=new FileInputStream(fileName);中哪個是字節(jié)流
2 回答無法導(dǎo)入FileInputStream包
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網(wǎng)安備11010802030151號
購課補貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號
2016-12-14
凌晨來回答問題。
首先我們要弄明白,對于一個buf[i], 我們在什么情況下需要在輸出之前補0,什么時候不需要補0.答案很清楚,如果它的高四位都是0,那么我們需要補,否則不需要。那么問題來了,怎么判斷呢?
老師的代碼是用buf[i] <= 0xf,可是代碼結(jié)果不正確,會出現(xiàn)錯誤補0,也就是三個數(shù)字一起的情況。如果buf[i] == 0xff, 那么按程序是需要補0,因為作為一個byte,0xff實際上等于-1, 那么自然也小于0xf,因為0xf代表15.這就是出錯的問題。
if判定語句改為((buf&oxff)<=oxf)之后,實際上結(jié)果就正確了。因為在Java中整數(shù)默認是int,也就是4個字節(jié)。因為有buf[i] & 0xff, 注意這里0xff 是4個字節(jié)的int類型,那么計算之前會把buf[i]自動進行類型轉(zhuǎn)換,結(jié)果也是int類型,所以我們最終的到的結(jié)果是24位0加上原先的8位buf[i]。這時候的結(jié)果已經(jīng)絕對是個正數(shù),此時要判斷buf[i]高4位是否有1,就看他和0xf的大小就行了。這里要設(shè)計一點補碼的知識,我們還是以buf[i] == 0xff為例:
((buf&oxff)<=oxf)之后的結(jié)果是0x000000ff, 顯然是大于0xf,所以沒有補0.
實際上,我們也可以這么判斷:buf[i] & 0xf0 == 0;這樣的結(jié)果會保留buf[i]的高四位,其他位都是0,比較容易理解。
2016-11-28
if判定語句改為((buf&oxff)<=oxf);之后輸出都是兩位,這個不知原因,跪求求大神解惑???!
2016-11-28
還有,int b=in.read()則沒有以上問題;
2016-11-28
或許不是錯,但是為啥有三個數(shù)字一組的,這個不太懂。