如何生成一个IP地址范围,给定起始和结束IP地址?

8

如何从起始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可以是动态的,上面只是一个示例。
谢谢...

2
你必须知道子网才能做到这一点。 - OMG Ponies
@OMG Ponies:我刚刚添加了这个信息。 - Vishal
你想如何处理生成的地址?是只想将它们打印出来,还是想存储在某种数据结构中? - jswolf19
@jswolf19:我希望它们作为字符串,稍后我将把它们持久化到数据库中。 - Vishal
5个回答

11

请注意,IPv4地址的4个组成部分实际上是介于00和FF之间的十六进制数字。

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

您给出的范围是C0A80002至C0A800FE。

此处提供一段代码,可在十六进制数字和IPv4地址之间进行转换:

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


没错,这样更好 :) 记得考虑IPv6。 - Ryan Stewart
@Ryan:没错,这就是为什么我在我的回答中明确提到了v4 :-) IPv6是128位的,详情请参见http://en.wikipedia.org/wiki/IPv6#Larger_address_space - Eric J.

3
这里有一个简单的实现,可以输出你所需的内容:
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地址的最后一部分的范围。

你能解释一下正则表达式 "(?<=\\.)(?!.*\\.)" 吗? - Labeo
2
@Labeo "(?<=\\.)" 是一个后顾断言,它断言前面的输入字符是一个点。"(?!.*\\.)" 是一个负向前瞻,它断言接下来的输入不匹配任何数量的字符然后是一个点。"(?<=\\.)(?!.*\\.)" 全部在一起的意思是“仅在点之后(字符之间)匹配,当输入的其余部分包含点时”,在正常语言中是“最后一个点之后”。 - Bohemian

2

从2开始计数,一直到254,并在前面加上“192.168.0.”:

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

2
这不是很通用。OP也没有指定只有较低的组件需要递增... - jswolf19
@Ryan:对于他特定的示例可以工作,但如果范围超过1个字节怎么办? - Eric J.
@jswolf19:实际上,OP刚刚修改了问题,指定只需要增加低字节:-),但我同意这个答案并不是很通用。 - Eric J.
@Ryan:这个例子可以工作,但如果我有不同的子网掩码,我必须以不同的方式处理它。 - Vishal
那种方法太复杂了。直接手动写下253个字符串会更容易一些。或者雇请人来制作也可以。 - default locale

1
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);
}
}

0

使用IPAddress Java库, 您可以透明地使用支持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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接