除了在一个巨大的嵌套循环中迭代所有字节外,有什么有效的方法可以生成所有可能的IP v4地址?
编辑:我的上一个答案是从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),请查阅二进制补码。基本上,将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
)。所有可能的IP地址范围从0.0.0.0到255.255.255.255,即从0到0xFFFFFFFF。
你可以从一个初始化为零的无符号整数/长整型(32位数据类型)开始递增,直到达到0xffffffff。
递增运算符通常比嵌套循环稍微更有效率。
使用位掩码和位移操作符来提取你感兴趣的任何给定字节。
就“效率”而言,我认为没有比循环遍历所有可能值更好的方法。
请注意两件事: 1.有很多地址,所以效率不会很高。 2.并非所有IP地址都是有效的(而且有很多地址可能不是您想要遍历的)。
关于哪些IP地址是有效的示例,请注意224.0.0.0到239.255.255.255之间的所有地址都是多播地址,以127.x.x.x开头的所有地址都是无效的等等。
& 0xff
将移除符号位。循环可以从0到-1(因为-1 == 0xffffffff)。它仍然可以工作,因为Integer.MAX_VALUE + 1 === Integer.MIN_VALUE
。 - Kip