码迷,mamicode.com
首页 > 其他好文 > 详细

IP地址和int互转

时间:2019-07-07 22:46:39      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:ips   als   就是   date   左移   print   oct   ati   return   

/**
 * @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);
    }
}

 

IP地址和int互转

标签:ips   als   就是   date   左移   print   oct   ati   return   

原文地址:https://www.cnblogs.com/heqiyoujing/p/11148313.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!