【问题标题】:How do I get generate an IP address range given start and end IP address?如何在给定开始和结束 IP 地址的情况下生成 IP 地址范围?
【发布时间】:2020-10-20 13:29:43
【问题描述】:

如何从起始 IP 地址和结束 IP 地址生成 IP 地址范围?

网络“192.168.0.0/24”的示例:

String start = "192.168.0.2"
String end = "192.168.0.254"

我想拥有:

192.168.0.2
192.168.0.3
192.168.0.4
192.168.0.5
...
192.168.0.254

PS:网络、起始IP和结束IP可以是动态的,上面只是一个例子。

谢谢...

【问题讨论】:

  • 你必须知道子网才能做到这一点。
  • @OMG Ponies:我刚刚添加了信息。
  • 您希望得到的地址如何?您只是想将它们打印出来,还是想将它们存储在某种数据结构中?
  • @jswolf19:我希望它们作为字符串,稍后我将保存到数据库中。

标签: java


【解决方案1】:

认识到 IPv4 地址的 4 个组成部分中的每一个实际上都是一个介于 00 和 FF 之间的十六进制数字。

如果您将开始和结束 IP 地址更改为 32 位无符号整数,则只需从最低位循环到最高位,然后将循环通过的每个值转换回 IP 地址格式。

您给出的示例中的范围是 C0A80002 到 C0A800FE。

这是一个在十六进制数字和 IPv4 地址之间转换的代码的链接

http://technojeeves.com/joomla/index.php/free/58-convert-ip-address-to-number

【讨论】:

【解决方案2】:

这是输出您所要求的内容的简单实现:

public static void main(String args[]) {
    String start = "192.168.0.2";
    String end = "192.168.0.254";

    String[] startParts = start.split("(?<=\\.)(?!.*\\.)");
    String[] endParts = end.split("(?<=\\.)(?!.*\\.)");

    int first = Integer.parseInt(startParts[1]);
    int last = Integer.parseInt(endParts[1]);

    for (int i = first; i <= last; i++) {
        System.out.println(startParts[0] + i);
    }
}

请注意,这适用于涉及 IP 地址的最后部分的范围。

【讨论】:

  • 你能解释一下正则表达式"(?&lt;=\\.)(?!.*\\.)"吗?
  • @Labeo "(?&lt;=\\.)" 是一个后视,它断言前面的输入字符是一个点。 "(?!.*\\.)" 是一个否定的前瞻,它断言以下输入不匹配任何数量的字符,然后是一个点。 "(?&lt;=\\.)(?!.*\\.)" all together 的意思是“当输入的其余部分 not 包含一个点时,就在一个点之后(字符之间)匹配”,在正常语音中是“就在最后一个点之后”。
【解决方案3】:

从 2 开始,数到 254,然后输入“192.168.0”。在它面前:

for (int i = 2; i <= 254; i++) {
    System.out.println("192.168.0." + i);
}

【讨论】:

  • 这不是很通用。 OP 没有指定只有较低的组件需要增加,或者......
  • @Ryan:适用于他的具体示例,但如果范围超过 1 个字节怎么办?
  • @jswolf19:实际上 OP 只是修改了问题以指定实际上只需要增加低字节:-),但我同意这个答案不是很笼统。
  • @Ryan:它适用于这个例子,但如果我有不同的网络掩码,我必须以不同的方式处理它。
  • 那个方法太复杂了。手动写下 253 个字符串要容易得多。或者雇人来做。
【解决方案4】:
void main(String args[]) 
{
String start = "192.168.0.2";
String end = "192.168.0.254";

String[] startParts = start.split("(?<=\\.)(?!.*\\.)");
String[] endParts = end.split("(?<=\\.)(?!.*\\.)");

int first = Integer.parseInt(startParts[1]);
int last = Integer.parseInt(endParts[1]);

for (int i = first; i <= last; i++) 
{
System.out.println(startParts[0] + i);
}
}

【讨论】:

    【解决方案5】:

    使用The IPAddress Java library,您可以透明地使用适用于 IPv4 和 IPv6 的代码。免责声明:我是 IPAddress 库的项目经理。

    这里是示例代码:

    String start = "192.168.0.2", end = "192.168.0.254";
    iterate(start, end);
    System.out.println();
    start = "::1";
    end = "::100";
    iterate(start, end);
    
    static void iterate(String lowerStr, String upperStr) throws AddressStringException  {
       IPAddress lower = new IPAddressString(lowerStr).toAddress();
       IPAddress upper = new IPAddressString(upperStr).toAddress();
       IPAddressSeqRange range = lower.toSequentialRange(upper);
       for(IPAddress addr : range.getIterable()) {
           System.out.println(addr);
       }
    }
    

    输出:

    192.168.0.2
    192.168.0.3
    192.168.0.4
    ...
    192.168.0.254
    
    ::1
    ::2
    ::3
    ...
    ::100
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-27
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      相关资源
      最近更新 更多