生成所有可能的IP v4地址的有效方法是什么?除了迭代一个巨大的嵌套for循环中的所有字节。
答案 0 :(得分:10)
修改:我之前的回答已经从128.0.0.0
升级到255.255.255.255
到0.0.0.0
再到127.255.255.255
。大概你想要从0.0.0.0
转到255.255.255.255
,所以我编辑了我的解决方案来做到这一点。
int i = -1;
do {
i++;
int b1 = (i >> 24) & 0xff;
int b2 = (i >> 16) & 0xff;
int b3 = (i >> 8) & 0xff;
int b4 = (i ) & 0xff;
//Now the IP is b1.b2.b3.b4
} while(i != -1);
注意:如果你对这个循环将如何结束感到困惑(即如何将足够的时间加1到-1再次使其为-1),请阅读two's complement。基本上,向Integer.MAX_VALUE
添加一个会产生Integer.MIN_VALUE
,并且不会引发任何异常。
旧答案。仍然会击中所有IP,但可能不是您想要的顺序:
for(long n = Integer.MIN_VALUE; n <= Integer.MAX_VALUE; n++)
{
int i = (int)n;
int b1 = (i >> 24) & 0xff;
int b2 = (i >> 16) & 0xff;
int b3 = (i >> 8) & 0xff;
int b4 = (i ) & 0xff;
//Now the IP is b1.b2.b3.b4
}
请注意:如果循环控制变量是int
而不是long
,则这将是一个无限循环(因为所有int
始终是<= Integer.MAX_VALUE
)
答案 1 :(得分:3)
并非所有IPv4地址都有效,具体取决于它们的用途。请参阅此处有关保留地址块和链接RFC的部分:http://en.wikipedia.org/wiki/IPv4
因此,根据您的要求,您可能需要检查保留地址并将其保留。
答案 2 :(得分:2)
一切可能吗? 0.0.0.0到255.255.255.255,它是0到0xFFFFFFFF
答案 3 :(得分:1)
您可以从初始化为零的无符号整数/长整数(32位数据类型)开始,并继续递增,直到达到0xffffffff。
增量运算符通常比嵌套循环稍微高效。
使用位掩码和位移运算符来提取您感兴趣的任何给定字节。
答案 4 :(得分:1)
就“效率”而言,我认为没有比循环所有可能值更好的方法。
请注意两件事: 1.有很多地址,所以效率不高。 2.并非所有IP地址都有效(并且有很多地址可能无法覆盖)。
有关IP地址有效的示例,请注意224.0.0.0和239.255.255.255之间的所有地址都是多播地址,所有以127.x.x.x开头的地址都是无效的等等。