package 子网划分器;
import java.io.*;

public class VLSM {
  /**
   * @param args
   */
  public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub
    String ip; // 用于接收要划分的IP
    int s; // 用于接收以要划分的子网数
    int n; // 输入子网数对应的二进制位数

    System.out.println('---------------划分子网---------------');
    // 输入要划分的IP地址:ip
    System.out.println('请输入要划分的IP地址(格式为:x1.x2.x3.x4):');
    System.out.print('→:');
    InputStreamReader isr = new InputStreamReader(System.in);
    BufferedReader br = new BufferedReader(isr);
    ip = br.readLine();

    // 截取x1
    int index1 = ip.indexOf('.');
    String st1 = ip.substring(0, index1);
    int x1 = Integer.parseInt(st1);// 把String类型的st转化成int型

    // 截取x2
    int index2 = ip.indexOf('.', index1 + 1);
    String st2 = ip.substring(index1 + 1, index2);
    int x2 = Integer.parseInt(st2);// 把String类型的st转化成int型

    // 截取x3
    int index3 = ip.indexOf('.', index2 + 1);
    String st3 = ip.substring(index2 + 1, index3);
    int x3 = Integer.parseInt(st3);// 把String类型的st转化成int型

    // 截取x4
    // A类
    if (x1 > 0 && x1 <= 126) {
      System.out.println('本IP地址能划分划分的最大子网数为: ' + ((int) Math.pow(2, 24 - 2) - 2));
    }
    
    // B类
    if (x1 >= 128 && x1 <= 191) {
      System.out.println('本IP地址能划分划分的最大子网数为: ' + ((int) Math.pow(2, 16 - 2) - 2));
    }
    // C类
    if (x1 >= 192 && x1 <= 223) {
      System.out.println('本IP地址能划分划分的最大子网数为: ' + ((int) Math.pow(2, 8 - 2) - 2));
    }

    // 输入要划分的子网数数:s
    System.out.println('请输入要划分的子网数:');
    System.out.print('→:');

    String subnet_num = br.readLine();
    s = Integer.parseInt(subnet_num);
    br.close();

    // 求所输入子网数对应的二进制位数:n

    for (n = 1; (Math.pow(2, n) - 2) < s; n++);

    System.out.println('--------------------------------------');
    // 获取超网掩码
    int sum = 0;
    
    for (int i = 0; i < n; i++) {
      sum = sum + (int) Math.pow(2, (7 - i));
    }
    String mask = '';
    // A类
    if (x1 > 0 && x1 <= 126) {
      if (n <= 8) {
        mask = '255.' + sum + '.0.0';
      } else if (n > 8 && n <= 16) {
        n = n - 8;
        sum = 0;
        for (int i = 0; i < n; i++) {
          sum = sum + (int) Math.pow(2, (7 - i));
        }
        mask = '255.255.' + sum + '.0';
      } else {
        n = n - 16;
        sum = 0;
        for (int i = 0; i < n; i++) {
          sum = sum + (int) Math.pow(2, (7 - i));
        }
        mask = '255.255.255.' + sum;
      }
      System.out.println('超网掩码为:' + mask); 
    }
    // B类
    if (x1 >= 128 && x1 <= 191) {
      if (n <= 8) {
        mask = '255.255.' + sum + '.0';
      } else {
        n = n - 8;
        sum = 0;
        for (int i = 0; i < n; i++) {
          sum = sum + (int) Math.pow(2, (7 - i));
        }
        mask = '255.255.255.' + sum;
      }
      System.out.println('超网掩码为:' + mask);
    }
    // C类
    if (x1 >= 192 && x1 <= 223) {
      mask = '255.255.255.' + sum;
      System.out.println('超网掩码为:' + mask);
    }
    System.out.println('子网掩码为:' + mask);

    // 计算超网地址和广播地址
    int currentNetId = 0;
    int currentHostId = 1;
    String currentIP = x1 + '.' + x2 + '.' + x3 + '.' + currentHostId;
    String lastIP = '';
    String broadcastIP = '';
    while (true) {
      if ((currentHostId & ((int) Math.pow(2, (n - 1))) - 1) == 0) {
        if (!lastIP.isEmpty()) {
          broadcastIP = currentIP.substring(0, currentIP.lastIndexOf('.')) + '.' + (currentHostId - 2);
          System.out.println('子网' + currentNetId + '的 IP 范围:' + lastIP + ' 到 ' + broadcastIP);
        }
        lastIP = currentIP;
        currentNetId++;
        // B类地址,当网络号是0的时候跳过,因为这个地址保留不使用
        if (x1 >= 128 && x1 <= 191 && currentNetId == 1) {
          currentNetId++;
        }
        if (currentNetId == s) {
          break;
        }
      }
      currentHostId++;
      currentIP = x1 + '.' + x2 + '.' + x3 + '.' + currentHostId;
    }
    broadcastIP = currentIP.substring(0, currentIP.lastIndexOf('.')) + '.' + (currentHostId - 2);
    System.out.println('子网' + currentNetId + '的 IP 范围:' + lastIP + ' 到 ' + broadcastIP);
    System.out.println('--------------------------------------');
    System.out.println('超网地址为:' + ip + '/' + n);
    System.out.println('广播地址为:' + broadcastIP);
  }
}
Java VLSM 子网划分器代码优化 - 超网掩码和广播地址计算

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

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