【问题标题】:How to get Subnet from an IP in Java如何从Java中的IP获取子网
【发布时间】:2017-05-06 12:10:34
【问题描述】:

如何从 IP 地址获取子网值。 例如,我们可以在 Python 中执行以下操作。 (但是 Java 呢?)

interface = ipaddress.IPv4Interface('11.22.104.0/0.0.0.255')
value = interface.with_prefixlen

输出值 = 11.22.104.0/24

基本上,我需要一个函数将 0.0.0.255 转换为 /24。谢谢。

编辑

-使用Java 7。

【问题讨论】:

    标签: java python interface ip subnet


    【解决方案1】:

    使用番石榴:

    int slash = Integer.bitCount(
            ~Ints.fromByteArray(
                    InetAddresses.forString("0.0.0.255").getAddress()));
    

    使用 Java 8:

    int slash = Arrays.stream("0.0.0.255".split("\\."))
            .mapToInt(Integer::parseInt)
            .map(i -> ~i & 0xFF)
            .map(Integer::bitCount)
            .sum();
    

    使用 Java 7:

    int slash = 0;
    for (String octet : "0.0.0.255".split("\\.")) {
        slash += Integer.bitCount(~Integer.parseInt(octet) & 0xFF);
    }
    

    slash 的值为 24。

    【讨论】:

    • Java 7 中有现成的库吗?我的应用程序使用的是 Java 7,因此上面提供的代码不起作用。很抱歉从未提及 Java 版本。
    • @user1841495 添加了 Java 7 版本。
    • 感谢 Java 7 的解决方案,您介意解释一下吗?我将很快用这个解决方案进行测试。非常感谢。
    • @user1841495 基本上我们将 IP 地址转换为 4 个无符号字节,然后计算反转位(因为这是 wildcard mask)。
    【解决方案2】:

    The IPAddress Java library 以多态方式支持 IPv4 和 IPv6 子网。免责声明:我是项目经理。以下代码将主机掩码转换为前缀长度:

    IPAddressString maskString = new IPAddressString("0.0.0.255");
    IPAddress mask = maskString.toAddress();
    Integer prefLen = mask.getBlockMaskPrefixLength(false);//24
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-06
      • 2021-12-15
      • 2018-11-24
      • 1970-01-01
      • 1970-01-01
      • 2015-02-24
      • 1970-01-01
      • 2016-09-24
      相关资源
      最近更新 更多