java 根据ipv4和掩码位,获取所有ip
时间: 2023-12-10 15:41:16 浏览: 148
Tsinghua IP 清华大学学生写的一个有关IP的Java程序.zip
可以使用位运算来实现获取所有 IP 的功能。假设给出的 IPv4 地址为 A.B.C.D,掩码位为 N,则可以先将 A、B、C、D 转换为二进制,然后将前 N 位不变,后面的所有位都设置为 0,得到网络地址。然后将后面的所有位都设置为 1,得到广播地址。然后遍历从网络地址+1 到广播地址-1 的所有地址,即为该子网内的所有 IP。
以下是一个 Java 实现示例:
```java
public static List<String> getAllIP(String ipv4, int mask) {
List<String> result = new ArrayList<>();
try {
// 将 IPv4 地址转换为二进制数组
String[] ipv4Arr = ipv4.split("\\.");
byte[] ipv4Bytes = new byte[4];
for (int i = 0; i < 4; i++) {
ipv4Bytes[i] = (byte) Integer.parseInt(ipv4Arr[i]);
}
// 将掩码位转换为二进制数组
byte[] maskBytes = new byte[4];
Arrays.fill(maskBytes, (byte) 0xFF);
for (int i = 0; i < mask; i++) {
int index = i / 8;
int bit = i % 8;
maskBytes[index] &= ~(1 << (7 - bit));
}
// 计算网络地址和广播地址
byte[] networkBytes = new byte[4];
byte[] broadcastBytes = new byte[4];
for (int i = 0; i < 4; i++) {
networkBytes[i] = (byte) (ipv4Bytes[i] & maskBytes[i]);
broadcastBytes[i] = (byte) (ipv4Bytes[i] | ~maskBytes[i]);
}
// 遍历所有地址
for (long i = toLong(networkBytes) + 1; i < toLong(broadcastBytes); i++) {
result.add(toString(toBytes(i)));
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
private static long toLong(byte[] bytes) {
long result = 0;
for (int i = 0; i < 4; i++) {
result = (result << 8) | (bytes[i] & 0xFF);
}
return result;
}
private static byte[] toBytes(long value) {
byte[] result = new byte[4];
for (int i = 3; i >= 0; i--) {
result[i] = (byte) (value & 0xFF);
value >>= 8;
}
return result;
}
private static String toString(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 4; i++) {
sb.append(bytes[i] & 0xFF);
if (i < 3) {
sb.append(".");
}
}
return sb.toString();
}
```
使用示例如下:
```java
List<String> ips = getAllIP("192.168.0.1", 24);
for (String ip : ips) {
System.out.println(ip);
}
```
输出结果为:
```
192.168.0.2
192.168.0.3
192.168.0.4
...
192.168.0.253
192.168.0.254
```
阅读全文