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);
修改下列代码增加构造超网的功能:import javaio; public class ffdg 		 param args	 	public static void mainString argsthrows IOException 		 TODO Auto-generated method stub		String ip; 用于接收要划分的IP int s; 用于接

原文地址: https://www.cveoy.top/t/topic/fDiu 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录