2

我是 Java 新手,正在使用 Java 做一个项目。

我有一个 IP(例如:)192.168.0.10和一个子网掩码(比如说,255.255.255.0)。我需要这个子网中所有 IP 地址的列表。我能想到的最好的是天真的解决方案(我必须处理比特和所有)。有谁知道这样做的更好/e.legant 方式。

如果我们考虑这个例子,我们将有 ip 列表192.168.0.1. 192.168.0.2, 192.168.0.3, ..... , 192.168.0.254

任何帮助表示赞赏。

[编辑]我想到的幼稚方法:

通过考虑您拥有的 IP 地址和子网来构造一个整数。在我们的例子中,这将是二进制表示11000000.10101000.00000000.00000000(添加点以提高可读性)。将此数字加 1,直到左起 24 位切换。它切换的第一个图块我们已经生成了所有可能在该子网中 ip 的数字。现在的任务是从 32 位数字生成 ip,这可以通过编写一次提取 8 位的函数来完成。

4

2 回答 2

3

Apache Commons SubnetUtils

SubnetUtils utils = new SubnetUtils("192.168.0.10", "255.255.255.0");
String[] addresses = utils.getInfo().getAllAddresses();

getHighAddress并且getLowAddress可能对您非常有用。在文档中查看更多详细信息。

于 2012-12-14T15:04:37.167 回答
1

这个怎么样?

更新:小调整以防止枚举两个特殊用途的 IP(网络 IP 和广播 IP)。我认为这是最简单的解决方案,没有额外的依赖。

最后更新:我对 Java 在舍入符号除法中的规则进行了更正。

public class ListIPs
{
    static int IPNum(int a, int b, int c, int d)
    {
        int ip = ((a * 256 | b) * 256 | c) * 256 | d;
        return ip;
    }

    static void ListIPs(int ip, int mask)
    {
        int index;
        int count = 1;
        int temp = mask;
        long a, b, c, d;

        while ((temp & 1) == 0)
        {
            count *= 2;
            temp >>= 1;
        }

        for (index = 1; index < count -1; index++)
        {
            long newIP = ((ip & mask) | index) & 0xFFFFFFFFL;


            d = newIP & 0xFF;
            c = (newIP / 256) & 0xFF;
            b = (newIP / 65536) & 0xFF;
            a = (newIP / 16777216) & 0xFF;

            System.out.println("" + a + "." + b + "." + c + "." + d);
        }
    }

    public static void main(String[] args)
    {
        ListIPs(IPNum(192, 168, 0, 10), IPNum(255, 255, 255, 0));
    }
}
于 2012-12-14T15:09:55.577 回答