麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Java > 正文

Java輸出通過InetAddress獲得的IP地址數組詳細解析

2019-11-26 15:57:52
字體:
來源:轉載
供稿:網友

使用 InetAddress 獲取 IP 地址會得到一個 byte 數組
如果你直接輸出這個數組,你會發現 IP 地址中的某些位變成了負數
比如 61.135.169.105 會輸出成 61.-121.-87.105
仔細看一看,會發現 135 + 121 = 256,169 + 87 = 256

-_-! 怎么個情況!

我首先想到的是 byte 類型向 int 類型轉換過程中出現了問題,后來發現,實際不然

因為 Java 中沒有 unsigned 類型,所以byte、short、int、long 都是有符號的,所以根本就不存在隱式類型轉換出錯的問題。

既然說到了 Java 沒有 unsigned 類型,那么 byte 是 8 位,所以表示范圍為 -127 - 128,而 IP 一個段的表示范圍為 0 - 255,終于找到了不對勁的地方了

IP 的一個段是一個 unsigned byte,這樣一個 unsigned byte 存入一個 signed byte 中當然會導致一些問題出現

分析一下:
35 的二進制編碼為 1000 0111,最高位置為 1

由于 byte 被認為是 unsigned byte,所以最高位的 1 將會被解釋為符號位,另外 Java 中存儲是按照補碼存儲,所以 1000 0111 會被認為是補碼形式,轉換成原碼便是 1111 0001,轉換成十進制數便是 -121。

再看,65 的二進制編碼為 0100 0001,由于小于 128,所以沒有將最高位置 1,0100 0001 的補碼還是 0100 0001,所以 65 不變。

分析這么多,這個問題的解決方法其實很簡單,將 byte 變量與 0xFF 按位與即可,過程中 byte 會隱式類型轉換為 int,當與 0xFF 按位與的時候,會將除了低 8 位的其他位全部置 0,這樣一來便將符號擴展的那些高位清除掉了。

最后附上一個自己寫的通用函數,用來將整型變量的二進制編碼輸出

復制代碼 代碼如下:

/**
 * 將整型變量的二進制編碼形式輸出
 * @param n 整型變量
 * @param size 整型的二進制長度,可使用類似 Short.SIZE 獲得
 * @return 二進制編碼字符串
 */
public static String printBinary(long n, int size) {
 StringBuilder sb = new StringBuilder();
 for (int i = size - 1; i >= 0; i--) {
  sb.append(n >>> i & 0x01);
  if (i % 4 == 0) {
   sb.append(" ");
  }
 }
 return sb.toString();
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美老逼 | 色骚综合 | 久久久精品网 | 91久久久久久久久久久久久 | 国产毛片aaa一区二区三区视频 | 91精品国产综合久久青草 | 久久国产秒 | 黄污在线观看 | 精品一区二区三区免费毛片爱 | 久久艹精品 | 在线成人看片 | 毛片118极品美女写真 | 国产精品视频2021 | 日韩av片在线免费观看 | 国产黄色一级大片 | 成人短视频在线观看 | 亚洲一区国产二区 | 亚洲精品一区中文字幕 | 一区二区网 | 91短视频在线观看视频 | 国产精品成人免费一区久久羞羞 | 国产精品成人一区二区三区吃奶 | 精品国产一区二区三区久久久蜜月 | 欧美不卡三区 | 久久国产精 | 91 免费看片 | 欧美一级做一a做片性视频 日韩黄色片免费看 | 超久久 | 99亚洲视频| 曰韩精品| 精品一区二区三区免费看 | 国产高潮失禁喷水爽到抽搐视频 | 青青草华人在线 | 三人弄娇妻高潮3p视频 | 色阁五月| 密室逃脱第一季免费观看完整在线 | 免费一级毛片网站 | 夜夜夜精品视频 | 91精品国啪老师啪 | 久草在线免费资源站 | 欧美日韩亚洲一区二区三区 |