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