修改下列代码增加构造超网的功能:import javaio; public class ffdg param args public static void mainString argsthrows IOException TODO Auto-generated method stub String ip; 用于接收要划分的IP int s; 用于接
import java.io.*;
public class ffdg { private static final String IP_REGEX = "(\d{1,3}\.){3}\d{1,3}"; private static final String MASK_REGEX = "/(\d{1,2})"; private static final int[] MASKS = new int[]{0x00000000, 0x80000000, 0xC0000000, 0xE0000000, 0xF0000000, 0xF8000000, 0xFC000000, 0xFE000000, 0xFF000000, 0xFF800000, 0xFFC00000, 0xFFE00000, 0xFFF00000, 0xFFF80000, 0xFFFC0000, 0xFFFE0000, 0xFFFF0000, 0xFFFF8000, 0xFFFFC000, 0xFFFFE000, 0xFFFFF000, 0xFFFFF800, 0xFFFFFC00, 0xFFFFFE00, 0xFFFFFF00, 0xFFFFFF80, 0xFFFFFFC0, 0xFFFFFFE0, 0xFFFFFFF0, 0xFFFFFFF8, 0xFFFFFFFC, 0xFFFFFFFE, 0xFFFFFFFF}; private static final int MAX_SUBNETS_A = (int) Math.pow(2, 24 - 2) - 2; private static final int MAX_SUBNETS_B = (int) Math.pow(2, 16 - 2) - 2; private static final int MAX_SUBNETS_C = (int) Math.pow(2, 8 - 2) - 2;
public static void main(String[] args) throws IOException {
String ip;
int s;
int n;
System.out.println("---------------划分子网---------------");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
System.out.println("请输入要划分的IP地址(格式为:x1.x2.x3.x4):");
System.out.print("→:");
ip = br.readLine();
if (!ip.matches(IP_REGEX)) {
System.out.println("IP地址格式错误!");
return;
}
System.out.println("请输入要划分的子网数:");
System.out.print("→:");
String subnetNum = br.readLine();
s = Integer.parseInt(subnetNum);
br.close();
int[] ipArray = parseIP(ip);
if (ipArray == null) {
System.out.println("IP地址格式错误!");
return;
}
int subnetBits = calculateSubnetBits(s);
if (subnetBits == -1) {
System.out.println("无法划分对应数量的子网!");
return;
}
int[] maskArray = calculateMask(subnetBits);
int[] networkArray = calculateNetwork(ipArray, maskArray);
int subnetHosts = calculateSubnetHosts(subnetBits);
System.out.println("--------------------------------------");
System.out.println("子网掩码为:" + formatIP(maskArray));
System.out.println("每网段主机数:" + subnetHosts);
System.out.println("各子网IP范围如下:");
int subnetCount = (int) Math.pow(2, subnetBits);
for (int i = 1; i < subnetCount - 1; i++) {
int[] subnetArray = calculateSubnet(networkArray, subnetHosts, i);
System.out.print("<" + i + "> ");
System.out.println(formatIP(subnetArray) + "---" + formatIP(calculateBroadcast(subnetArray, maskArray)));
}
System.out.println("子网划分完毕");
}
private static int[] parseIP(String ip) {
String[] parts = ip.split("\\.");
if (parts.length != 4) {
return null;
}
int[] ipArray = new int[4];
for (int i = 0; i < 4; i++) {
int num = Integer.parseInt(parts[i]);
if (num < 0 || num > 255) {
return null;
}
ipArray[i] = num;
}
return ipArray;
}
private static int calculateSubnetBits(int s) {
if (s <= 0) {
return -1;
}
for (int i = 0; i <= 30; i++) {
if (s <= Math.pow(2, i) - 2) {
return 32 - i;
}
}
return -1;
}
private static int[] calculateMask(int subnetBits) {
return new int[]{MASKS[subnetBits], MASKS[subnetBits + 1], MASKS[subnetBits + 2], MASKS[subnetBits + 3]};
}
private static int[] calculateNetwork(int[] ipArray, int[] maskArray) {
int[] networkArray = new int[4];
for (int i = 0; i < 4; i++) {
networkArray[i] = ipArray[i] & maskArray[i];
}
return networkArray;
}
private static int calculateSubnetHosts(int subnetBits) {
return (int) Math.pow(2, 32 - subnetBits) - 2;
}
private static int[] calculateSubnet(int[] networkArray, int subnetHosts, int i) {
int[] subnetArray = new int[4];
subnetArray[0] = networkArray[0];
subnetArray[1] = networkArray[1];
subnetArray[2] = networkArray[2] + (i - 1) * subnetHosts;
subnetArray[3] = networkArray[3] + 1;
while (subnetArray[2] > 255) {
subnetArray[1]++;
subnetArray[2] -= 256;
}
return subnetArray;
}
private static int[] calculateBroadcast(int[] subnetArray, int[] maskArray) {
int[] broadcastArray = new int[4];
for (int i = 0; i < 4; i++) {
broadcastArray[i] = (subnetArray[i] & maskArray[i]) | (~maskArray[i] & 0xFF);
原文地址: https://www.cveoy.top/t/topic/fDiu 著作权归作者所有。请勿转载和采集!