程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java輸入經由過程InetAddress取得的IP地址數組具體解析

Java輸入經由過程InetAddress取得的IP地址數組具體解析

編輯:關於JAVA

Java輸入經由過程InetAddress取得的IP地址數組具體解析。本站提示廣大學習愛好者:(Java輸入經由過程InetAddress取得的IP地址數組具體解析)文章只能為提供參考,不一定能成為您想要的結果。以下是Java輸入經由過程InetAddress取得的IP地址數組具體解析正文


應用 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();
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved