国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > 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();
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新宁县| 华坪县| 鹤峰县| 镇坪县| 汨罗市| 汝阳县| 邯郸县| 德兴市| 咸丰县| 阜城县| 舞阳县| 嘉义县| 东明县| 运城市| 北碚区| 大城县| 颍上县| 肇州县| 元氏县| 娱乐| 衡南县| 渝中区| 宁晋县| 红安县| 龙江县| 秦皇岛市| 西和县| 旬邑县| 西安市| 运城市| 淮南市| 象山县| 大安市| 新干县| 湖口县| 右玉县| 冀州市| 新余市| 金堂县| 时尚| 霍林郭勒市|