zoukankan      html  css  js  c++  java
  • ip地址与整数的相互转化

    1.为什么需要将ip转化为整数

    对于ipv4的ip地址,如果使用字符串存储,占用的空间比较大。比如0.1.2.3这个字符串,需要的是7个字节。而对于255.255.255.255这个字符串,需要的是15个字节。整体看来,存储一个ip地址需要7-15个字节。

    那么实际使用过程中有没有更好的方式存储,从而节省存储空间?答案是肯定的。
    ipv4本质是32为的二进制字符串,一个int的整数刚好是4个字节32位,所以一个int类型的整数刚好可以表示一个ipv4地址。因此,我们使用4个字节的int类型数字来表示一个ip地址,这样可以达到节省空间的目标。

    2.ip地址转整数

    下面我们来看看具体怎么实现ip地址转整数。

    public class Ipaddress {
        public static boolean isIpv4Address(String ip) {
            if (StringUtils.isEmpty(ip)) {
                return false;
            }
    
            String[] lines = ip.split("\.");
    
            if (lines.length != 4) {
                return false;
            }
    
            for (String pattern : lines) {
                try {
                    int number = Integer.parseInt(pattern);
    
                    if ((number >= 0) && (number <= 255)) {
                        continue;
                    } else {
                        return false;
                    }
                } catch (NumberFormatException e) {
                    return false;
                }
            }
    
            return true;
        }
    
        public static int ip2int(String ip) {
            if (!isIpv4Address(ip)) {
                throw new RuntimeException("invalid ip address");
            }
    
            int result = 0;
            String[] lines = ip.split("\.");
    
            for (String pattern : lines) {
                int number = Integer.parseInt(pattern);
                result = number | (result << 8);
            }
    
            return result;
        }
    
        public static void main(String[] args) {
            String ip = "125.213.100.123";
            int result = ip2int(ip);
            System.out.println(result);
            System.out.println((125 * 256 * 256 * 256) + (213 * 256 * 256) +
                (100 * 256) + 123);
        }
    }
    

      

    代码的输出结果为:

    2111136891

    2111136891


    上面代码的思路:
    1.首先判断输入ip地址的合法性。
    2.将ip按.分隔,分成4段。
    3.将第一段左移24位,第二段左移16位,第三段左移8位,第四段不变,结果相加,就可以得到最终的结果。具体的实现逻辑就是
    result = number | (result << 8)这一行。
    4.如果是最暴力的方法,main方法里的125*256*256*256+213*256*256+100*256+123这部分,实现的就是第三条提到的逻辑,两者得到的最终结果是一样的。

    3.整数转ip地址

    反过来,如果我们有一个整数,想转换为ip地址,其实就是上面的逆过程。

    import org.apache.commons.lang3.StringUtils;
    
    
    public class Ipaddress {
        public static String int2ip(int num) {
            return ((num >> 24) & 0xff) + "." + ((num >> 16) & 0xff) + "." +
            ((num >> 8) & 0xff) + "." + (num & 0xff);
        }
    
        public static void main(String[] args) {
            int num = 2111136891;
            String ip = int2ip(num);
            System.out.println(ip);
        }
    }
    

      

    具体的逻辑为:

    ip地址的第一段为num右移24位后取低8位
    ip地址的第二段为num右移16位后取低8位
    ip地址的第三段为num右移8位后取低8位
    ip地址的第四段为num取低8位

  • 相关阅读:
    经典问题的非经典解法
    经典问题之树的深度
    35、AndroidView的滑动方式
    30、Android属性动画
    31、Android矢量动画
    36、AndroidCanvas画布
    27、AndroidEventBus
    28、AndroidRxjava
    32、Android事件分发机制
    29、Android基本动画
  • 原文地址:https://www.cnblogs.com/kumufengchun/p/15219294.html
Copyright © 2011-2022 走看看