【发布时间】:2021-11-23 18:43:15
【问题描述】:
在一个范围内(例如 104.200.16.0 到 104.200.31.255)循环遍历每个 IP 地址的最简单和最快的方法是什么,最好是在 java 或 js 中?
【问题讨论】:
-
使用位掩码循环通过 int 来控制范围。然后转换为虚线四边形进行打印。
-
请提供足够的代码,以便其他人更好地理解或重现问题。
在一个范围内(例如 104.200.16.0 到 104.200.31.255)循环遍历每个 IP 地址的最简单和最快的方法是什么,最好是在 java 或 js 中?
【问题讨论】:
每个 IPv4 地址都可以转换为整数,因为基本上 IP 地址的每个部分本质上都是从 00 到 FF 的十六进制数字(从 0 到 255 的十进制数)。
所以我们只需要将两个地址转换为整数并遍历它们之间的值:
// Convert a string representing an IP to an integer
private static int convertToInt(String address) throws UnknownHostException {
InetAddress inetAddress = Inet4Address.getByName(address);
return ByteBuffer.allocate(4).put(inetAddress.getAddress()).getInt(0);
}
// Convert an integer to an IP string
private static String convertToIp(int address) throws UnknownHostException {
return Inet4Address.getByAddress(ByteBuffer.allocate(4).putInt(address).array()).getHostAddress();
}
public static void generate(String address1, String address2) throws UnknownHostException {
int numeric1 = convertToInt(address1);
int numeric2 = convertToInt(address2);
for (int i = Math.min(numeric1, numeric2); i <= Math.max(numeric1, numeric2); i++) {
System.out.println(convertToIp(i));
}
}
使用IPAddress 之类的库可能会更容易。
public static void generate(String lowerAddress, String upperAddress) throws AddressStringException {
IPAddress lower = new IPAddressString(lowerAddress).toAddress();
IPAddress upper = new IPAddressString(upperAddress).toAddress();
IPAddressSeqRange range = lower.toSequentialRange(upper);
for(IPAddress address : range.getIterable()) {
System.out.println(address);
}
}
【讨论】: