我是java的新手,正在使用Java做项目。
我有一个IP(例如192.168.0.10
)和一个子网掩码(让我们说,255.255.255.0
)。我需要这个子网中所有IP地址的列表。我能想到的最好的是天真的解决方案(我必须处理位和所有)。有没有人知道这样做的更好/更好的方式。
如果我们考虑这个例子,我们将把ip列表作为192.168.0.1. 192.168.0.2, 192.168.0.3, ..... , 192.168.0.254
任何帮助表示感谢。
[编辑]我想到了天真的方法:
通过考虑您拥有的IP地址和子网构造一个整数。在我们的例子中,它将以二进制表示形式11000000.10101000.00000000.00000000
(为了可读性而添加点)。将此数字递增1,直到从左切换24位。它切换的第一个图块我们生成了所有可能在该子网中的ip的数字。现在的任务是从32位数生成ip,这可以通过写一个一次提取8位的函数来完成。
答案 0 :(得分:3)
SubnetUtils utils = new SubnetUtils("192.168.0.10", "255.255.255.0");
String[] addresses = utils.getInfo().getAllAddresses();
getHighAddress
和getLowAddress
可能对您非常有用。在文档中查看更多详细信息。
答案 1 :(得分:1)
这个怎么样?
更新:小调整以防止枚举两个专用IP(网络IP和广播IP)。我认为这是没有额外依赖性的最简单的解决方案。
最终更新:我修改了Java对已签名部门进行四舍五入的规则。
public class ListIPs
{
static int IPNum(int a, int b, int c, int d)
{
int ip = ((a * 256 | b) * 256 | c) * 256 | d;
return ip;
}
static void ListIPs(int ip, int mask)
{
int index;
int count = 1;
int temp = mask;
long a, b, c, d;
while ((temp & 1) == 0)
{
count *= 2;
temp >>= 1;
}
for (index = 1; index < count -1; index++)
{
long newIP = ((ip & mask) | index) & 0xFFFFFFFFL;
d = newIP & 0xFF;
c = (newIP / 256) & 0xFF;
b = (newIP / 65536) & 0xFF;
a = (newIP / 16777216) & 0xFF;
System.out.println("" + a + "." + b + "." + c + "." + d);
}
}
public static void main(String[] args)
{
ListIPs(IPNum(192, 168, 0, 10), IPNum(255, 255, 255, 0));
}
}