我正在寻找一个包,它类似于IPv4和IPv6,但是是为Java编写的。它需要能够做到以下几点:
如果它也能:
我可能会写一个包来完成这一切,但是如果有人已经经历了这些麻烦,而且很可能已经做得更好了,我将全力使用它。有人知道这样一个或几个包能做到这一切吗?我们正在扩展到IPv6,因此如果可能的话,它需要同时适用于IPv4和IPv6。
我很感谢你的帮助。
发布于 2009-02-18 18:30:40
它只适用于IPv4,但是SubnetUtils类是公域网的一部分,具有您想要的功能。在此基础上,您可以编写IPv6版本并将其贡献给项目!:)
发布于 2013-02-23 14:20:39
也许CIDRUtils能帮你。它使您能够将CIDR符号转换为IP范围。
免责声明:我是CIDRUtils的作者。
发布于 2016-10-17 06:29:29
IPAddress Java库以多态方式支持IPv4和IPv6,包括子网。javadoc在链接中可用。免责声明:我是项目经理。
您列出的所有用例都透明地支持IPv4和Ipv6。换句话说,它与大多数其他实用程序的不同之处在于,下面的代码与IPv4或IPv6作为输入字符串的工作方式相同。
验证地址是否有效
String str = "::1";
IPAddressString addrString = new IPAddressString(str);
try {
IPAddress addr = addrString.toAddress();
...
} catch(AddressStringException e) {
//e.getMessage provides validation issue
}如果子网中包含地址,则返回
String str = "1::1";
String subnetStr = "1::/64";
IPAddressString addrString = new IPAddressString(str);
IPAddressString subnetString = new IPAddressString(subnetStr);
try {
IPAddress addr = addrString.toAddress();
IPAddress subnet = subnetString.toAddress();
boolean isContained = subnet.contains(addr); //true in this case
...
} catch(AddressStringException e) {
//e.getMessage provides validation issue
}返回给定子网的广播地址。
String subnetStr = "127.0.0.0/28";
IPAddressString subnetString = new IPAddressString(subnetStr);
try {
IPAddress subnet = subnetString.toAddress();
IPAddress broadcastAddr = subnet.getUpper();
...
} catch(AddressStringException e) {
//e.getMessage provides validation issue
}按顺序返回子网的地址列表
String subnetStr = "127.0.0.0/28";
IPAddressString subnetString = new IPAddressString(subnetStr);
try {
IPAddress subnet = subnetString.toAddress();
for(IPAddress addr : subnet.getIterable()) {
...
}
} catch(AddressStringException e) {
//e.getMessage provides validation issue
}对地址列表排序
List<IPAddressString> addrs;
Collections.sort(addrs); //IPAddressString implements Comparable获取一组子网网络和地址列表(响应于AhmedRana):
IPAddress subnet = new IPAddressString("192.168.0.0/28").getAddress();
IPAddress newSubnets = subnet.adjustPrefixLength(1, false);
System.out.println(newSubnets); //192.168.0.0-8/29
HashSet<IPAddress> subnetSet = new HashSet<IPAddress>();
ArrayList<IPAddress> addrList = new ArrayList<IPAddress>();
for(IPAddress addr : newSubnets.getIterable()) {
subnetSet.add(addr.toPrefixBlock());
addrList.add(addr);
}
System.out.println(subnetSet);//[192.168.0.0/29, 192.168.0.8/29]
System.out.println(addrList);
//[192.168.0.0/29, 192.168.0.1/29, 192.168.0.2/29,
//192.168.0.3/29, 192.168.0.4/29, 192.168.0.5/29,
//192.168.0.6/29, 192.168.0.7/29, 192.168.0.8/29,
//192.168.0.9/29, 192.168.0.10/29, 192.168.0.11/29,
//192.168.0.12/29, 192.168.0.13/29, 192.168.0.14/29,
//192.168.0.15/29]可能有很多地址。获得新子网列表的更有效方法是使用前缀块迭代器,它遍历前缀块子网,如下所示:
IPAddress subnet = new IPAddressString("192.168.0.0/28").getAddress();
IPAddress newSubnets = subnet.adjustPrefixLength(1, false);
System.out.println(newSubnets); // 192.168.0.0-8/29
Iterator<? extends IPAddress> iterator = newSubnets.prefixBlockIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
// 192.168.0.0/29
// 192.168.0.8/29https://stackoverflow.com/questions/558038
复制相似问题