在IPv4范围内生成所有IP地址

3
除了在一个巨大的嵌套循环中迭代所有字节外,有什么有效的方法可以生成所有可能的IP v4地址?
5个回答

11

编辑:我的上一个答案是从128.0.0.0255.255.255.255再到0.0.0.0,最后到127.255.255.255。假设您想要从0.0.0.0255.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),请查阅二进制补码。基本上,将1添加到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 )。

@S. Mark:不,但这并不重要。& 0xff将移除符号位。循环可以从0到-1(因为-1 == 0xffffffff)。它仍然可以工作,因为Integer.MAX_VALUE + 1 === Integer.MIN_VALUE - Kip
@S.Mark:我不确定这是否是你要表达的意思,但他可能想从0到0xffffffff。我已经更新了我的答案来实现这一点。 - Kip

3
并非所有的IPv4地址都是有效的,这取决于它们所用于的目的。请参阅保留地址块部分和此处链接的RFC:http://en.wikipedia.org/wiki/IPv4 因此,根据您的需求,您可能需要检查保留地址并将其排除在外。

2

所有可能的IP地址范围从0.0.0.0到255.255.255.255,即从0到0xFFFFFFFF。


返回从开始到结束的所有可能有效的IP地址。 - Hamza Yerlikaya
我明白了,能告诉我这样做的目的是什么吗?是为了检查有效的IP地址吗? - YOU
啊,我明白了,要做一个分配的IP地址映射,你需要一些数据资源,但是我现在的参考链接中没有这些。 - YOU

1

你可以从一个初始化为零的无符号整数/长整型(32位数据类型)开始递增,直到达到0xffffffff。

递增运算符通常比嵌套循环稍微更有效率。

使用位掩码和位移操作符来提取你感兴趣的任何给定字节。


1

就“效率”而言,我认为没有比循环遍历所有可能值更好的方法。

请注意两件事: 1.有很多地址,所以效率不会很高。 2.并非所有IP地址都是有效的(而且有很多地址可能不是您想要遍历的)。

关于哪些IP地址是有效的示例,请注意224.0.0.0到239.255.255.255之间的所有地址都是多播地址,以127.x.x.x开头的所有地址都是无效的等等。


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