最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java輸出通過InetAddress獲得的IP地址數(shù)組詳細(xì)解析

 更新時間:2013年09月16日 08:44:15   作者:  
由于byte被認(rèn)為是unsigned byte,所以最高位的1將會被解釋為符號位,另外Java中存儲是按照補碼存儲,所以1000 0111會被認(rèn)為是補碼形式,轉(zhuǎn)換成原碼便是1111 0001,轉(zhuǎn)換成十進(jìn)制數(shù)便是-121

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

-_-! 怎么個情況!

我首先想到的是 byte 類型向 int 類型轉(zhuǎn)換過程中出現(xiàn)了問題,后來發(fā)現(xiàn),實際不然

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

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

IP 的一個段是一個 unsigned byte,這樣一個 unsigned byte 存入一個 signed byte 中當(dāng)然會導(dǎo)致一些問題出現(xiàn)

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

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

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

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

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

復(fù)制代碼 代碼如下:

/**
 * 將整型變量的二進(jìn)制編碼形式輸出
 * @param n 整型變量
 * @param size 整型的二進(jìn)制長度,可使用類似 Short.SIZE 獲得
 * @return 二進(jìn)制編碼字符串
 */
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();
}

相關(guān)文章

  • SpringBoot?整合數(shù)據(jù)源的具體實踐

    SpringBoot?整合數(shù)據(jù)源的具體實踐

    本文主要介紹了SpringBoot?整合數(shù)據(jù)源的具體實踐,利用?Spring?Boot?的自動配置和簡化的注解來簡化數(shù)據(jù)源配置工作,從而更專注于應(yīng)用程序的業(yè)務(wù)邏輯開發(fā),感興趣的可以了解一下
    2023-11-11
  • Java中常用的五種List聲明并賦值操作方式

    Java中常用的五種List聲明并賦值操作方式

    在Java編程中經(jīng)常會使用到集合類來存儲和操作多個元素,List是一種常見的集合類,它允許存儲重復(fù)的元素,并且保持元素的插入順序,這篇文章主要給大家介紹了關(guān)于Java中常用的五種List聲明并賦值操作的相關(guān)資料,需要的朋友可以參考下
    2024-02-02
  • Map集合之HashMap的使用及說明

    Map集合之HashMap的使用及說明

    這篇文章主要介紹了Map集合之HashMap的使用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • java自定義注解驗證手機(jī)格式的實現(xiàn)示例

    java自定義注解驗證手機(jī)格式的實現(xiàn)示例

    這篇文章主要介紹了java自定義注解驗證手機(jī)格式的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • JDK21無法導(dǎo)入TimeUnit類的解決辦法

    JDK21無法導(dǎo)入TimeUnit類的解決辦法

    這篇文章主要給大家介紹了關(guān)于JDK21無法導(dǎo)入TimeUnit類的解決辦法,TimeUnit是java.util.concurrent包下面的一個類,TimeUnit提供了可讀性更好的線程暫停操作,通常用來替換Thread.sleep(),需要的朋友可以參考下
    2024-01-01
  • 解讀@NoArgsConstructor,@AllArgsConstructor,@RequiredArgsConstructor的區(qū)別及在springboot常用地方

    解讀@NoArgsConstructor,@AllArgsConstructor,@RequiredArgsConstr

    這篇文章主要介紹了解讀@NoArgsConstructor,@AllArgsConstructor,@RequiredArgsConstructor的區(qū)別及在springboot常用地方,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 基于JavaMail實現(xiàn)簡單郵件發(fā)送

    基于JavaMail實現(xiàn)簡單郵件發(fā)送

    這篇文章主要為大家詳細(xì)介紹了基于JavaMail實現(xiàn)簡單郵件發(fā)送,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • java多線程解決生產(chǎn)者消費者問題

    java多線程解決生產(chǎn)者消費者問題

    這篇文章主要介紹了java多線程解決生產(chǎn)者消費者問題的方法,實例分析了java采用多線程的方法解決生產(chǎn)者消費者問題的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • javaFX實現(xiàn)五子棋小游戲

    javaFX實現(xiàn)五子棋小游戲

    這篇文章主要為大家詳細(xì)介紹了javaFX實現(xiàn)五子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • Maven基礎(chǔ)知識大梳理

    Maven基礎(chǔ)知識大梳理

    這篇文章主要是Maven基礎(chǔ)知識大梳理,Maven主要是用來解決導(dǎo)入java類依賴的jar,編譯java項目主要問題,大家可以讀一讀這篇文章,更深一步的了解Maven
    2021-08-08

最新評論

旅游| 乌兰浩特市| 汶川县| 海门市| 房产| 嘉义县| 和田市| 郁南县| 互助| 辽源市| 乌拉特前旗| 历史| 建始县| 桓台县| 高台县| 成武县| 商河县| 海原县| 扎兰屯市| 仁怀市| 新安县| 尼勒克县| 金溪县| 柏乡县| 淳化县| 黄龙县| 广南县| 微山县| 郴州市| 安泽县| 民勤县| 库伦旗| 井冈山市| 葫芦岛市| 和龙市| 开原市| 仪陇县| 白山市| 仁布县| 苍溪县| 荣成市|