IP地址和int互轉


/**
 * @author: yqq
 * @date: 2019/5/8
 * @description: ip地址與int之間互換
 * https://mp.weixin.qq.com/s?__biz=MzIzMzgxOTQ5NA==&mid=2247486894&idx=1&sn=bf17d404a989c3bb202241326d94647b&chksm=e8fe91a7df8918b1708f0cb759c6f9411d43ac22c257d56cc9191f74dc5eadd666862bb4bd92&scene=0&xtrack=1#rd
 */
public class IPToString {
    /**
     &:全是1則為1,否則為 0
     |:只要一個為1則為1,否則為0

     十進制轉成十六進制:
     Integer.toHexString(int i)
     十進制轉成八進制
     Integer.toOctalString(int i)
     十進制轉成二進制
     Integer.toBinaryString(int i)
     十六進制轉成十進制
     Integer.valueOf("FFFF",16).toString()
     八進制轉成十進制
     Integer.valueOf("876",8).toString()
     二進制轉十進制
     Integer.valueOf("0101",2).toString()
     */

    public static void main(String[] args) {
        String[] ips4Test = new String[]{"0.0.0.0", "127.0.0.1",
                "192.168.1.1", "255.0.0.255", "255.255.255.255"};
        for (String ip : ips4Test) {
            test(ip);
        }
    }

    public static void test(String ip) {
        int ipInt = ip2Int(ip);
        String ipString = int2Ip(ipInt);
        System.out.println("用於測試的ip地址: " + ip + ", int表示: " + ipInt + ", 二進制: " + Long.toBinaryString(ipInt)
                + ", 轉回String: " + ipString + ",與測試 ip 地址是否相等: " + ip.equals(ipString));
    }

    /**
     * 將 ip 字符串轉換為 int 類型的數字
     * <p>
     * 思路就是將 ip 的每一段數字轉為 8 位二進制數,並將它們放在結果的適當位置上
     *
     * @param ipString ip字符串,如 127.0.0.1
     * @return ip字符串對應的 int 值
     */
    public static int ip2Int(String ipString) {
        // 取 ip 的各段
        String[] ipSlices = ipString.split("\\.");
        int rs = 0;
        for (int i = 0; i < ipSlices.length; i++) {
            // 將 ip 的每一段解析為 int,並根據位置左移 8 位
            int intSlice = Integer.parseInt(ipSlices[i]) << 8 * i;
            // 求與
            rs = rs | intSlice;
        }
        return rs;
    }

    /**
     * 將 int 轉換為 ip 字符串
     *
     * @param ipInt 用 int 表示的 ip 值
     * @return ip字符串,如 127.0.0.1
     */
    public static String int2Ip(int ipInt) {
        String[] ipString = new String[4];
        for (int i = 0; i < 4; i++) {
            // 每 8 位為一段,這里取當前要處理的最高位的位置
            int pos = i * 8;
            // 取當前處理的 ip 段的值
            int and = ipInt & (255 << pos);
            // 將當前 ip 段轉換為 0 ~ 255 的數字,注意這里必須使用無符號右移
            ipString[i] = String.valueOf(and >>> pos);
        }
        return String.join(".", ipString);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM