2011-09-05 165 views
6

如何从开始和结束IP地址生成一系列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可以在上面是动态的仅仅是一个例。

谢谢...

+2

你必须知道子网才能做到这一点。 –

+0

@OMG小马:我刚刚添加了信息。 – Vishal

+0

你想如何得到结果地址?你只是想打印出来,还是要将它们存储在某种数据结构中? – jswolf19

回答

10

认识到每个IPv4地址的4个组成部分是真正的00和FF之间的十六进制数。

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

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

下面是代码的链接是一个十六进制数和IPv4地址

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

+0

是的,这是更好的:)记得考虑IPv6。 –

+0

@Ryan:是的,这就是为什么我在我的答案中明确了v4 :-) IPv6是128位,详情在这里http://en.wikipedia.org/wiki/IPv6#Larger_address_space –

2

开始于2之间转换,数到254,并把“192.168.0。”在它的前面:

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

这不是非常通用的。 OP没有指定只有下面的组件需要增加,要么...... – jswolf19

+0

@Ryan:适用于他的具体示例,但如果范围超过1个字节会怎么样? –

+0

@ jswolf19:其实OP只是修改了这个问题,指出实际上只有低字节需要递增:-),但我同意这个答案不是非常通用的。 –

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地址的最后部分范围内的工作。

+0

你能解释一下正则表达式吗?(?<= \\。)(?!。* \\。)“'? – Labeo

+2

@Labeo'“(?<= \\。)”'是一个隐藏后面的声明前面的输入char是一个点。 '“(?!。* \\。)”'是一个反面向前看,断言以下输入不匹配任何数量的字符,然后点。 '“(?<= \\。)(?!。* \\。)“'all all means”的意思是在一个点之后(字符之间)匹配,当其余的输入不*包含一个点“,在正常的语音中”刚刚在最后一个点之后“。 – Bohemian

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