課程
/后端開發(fā)
/Java
/Java Socket應(yīng)用---通信是這樣練成的
byte[]來存IP地址不夠啊,超過128變-負(fù)的了,Java就是規(guī)定只能用byte嗎,怎么用int[]j接收getAddress()報(bào)錯(cuò)呢??
2015-12-12
源自:Java Socket應(yīng)用---通信是這樣練成的 2-1
正在回答
首先InetAddress.getLocalHost() 這個(gè)方法返回的就是byte[]數(shù)組,這個(gè)沒法改。
其次ipv4是4個(gè)0-255間的整數(shù)組成的,byte是1字節(jié)8 位,正好滿足(2的8次方=256),所以用byte去接是合適的。
但由于java中沒有unsigned的類型,所有數(shù)都是帶有正負(fù)位的,所以最高位的 1 將會被解釋為符號位,另外 Java 中存儲是按照補(bǔ)碼存儲,如果是地址中一個(gè)是135,轉(zhuǎn)二進(jìn)制?1000 0111 ,這會被java認(rèn)為是補(bǔ)碼形式,轉(zhuǎn)換成原碼便是 1111 0001,轉(zhuǎn)換成十進(jìn)制數(shù)便是 -121。
你沒法使用byte直接輸出地址,必須轉(zhuǎn)為更高級的類型。將 byte 數(shù)組中的值與 0xFF 按位與(&),過程中 byte 會隱式類型轉(zhuǎn)換為 int,當(dāng)與 0xFF 按位與的時(shí)候,會將除了低 8 位的其他位全部置 0,這樣一來便將符號擴(kuò)展的那些高位清除掉了。
明白了 ?Thx
用byte去接還不是一樣么,你要另起一個(gè)int[]去接
InetAddress?myInetAddess; byte[]?byteArray=new?byte[myInetAddress.getAddress()] for(int?i=0;i<myInetAddress.getAddress();i++){ byte[i]=byte[i]&(0xFF);//也就是說四個(gè)中只要有一個(gè)字節(jié)最高位為1的時(shí)候就需要這么隱式轉(zhuǎn)換嗎? }
舉報(bào)
分享的是 Java 中的網(wǎng)絡(luò)編程,使用Socket實(shí)現(xiàn)網(wǎng)絡(luò)聊天通信
1 回答getAddress
4 回答SERVER端先接收信息后發(fā)送信息,為什么在接收信息后調(diào)用了shutdownInput()
1 回答UDP發(fā)送接收
2 回答getAddress返回的字節(jié)輸出 輸出問題
1 回答UDP信息的接收?
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網(wǎng)安備11010802030151號
購課補(bǔ)貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動(dòng)學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號
2015-12-12
首先InetAddress.getLocalHost() 這個(gè)方法返回的就是byte[]數(shù)組,這個(gè)沒法改。
其次ipv4是4個(gè)0-255間的整數(shù)組成的,byte是1字節(jié)8 位,正好滿足(2的8次方=256),所以用byte去接是合適的。
但由于java中沒有unsigned的類型,所有數(shù)都是帶有正負(fù)位的,所以最高位的 1 將會被解釋為符號位,另外 Java 中存儲是按照補(bǔ)碼存儲,如果是地址中一個(gè)是135,轉(zhuǎn)二進(jìn)制?1000 0111 ,這會被java認(rèn)為是補(bǔ)碼形式,轉(zhuǎn)換成原碼便是 1111 0001,轉(zhuǎn)換成十進(jìn)制數(shù)便是 -121。
你沒法使用byte直接輸出地址,必須轉(zhuǎn)為更高級的類型。將 byte 數(shù)組中的值與 0xFF 按位與(&),過程中 byte 會隱式類型轉(zhuǎn)換為 int,當(dāng)與 0xFF 按位與的時(shí)候,會將除了低 8 位的其他位全部置 0,這樣一來便將符號擴(kuò)展的那些高位清除掉了。
2015-12-12
明白了 ?Thx
2015-12-12
用byte去接還不是一樣么,你要另起一個(gè)int[]去接
2015-12-12