Java VLSM 子网划分器代码优化 - 超网掩码和广播地址计算
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);
}
}
原文地址: https://www.cveoy.top/t/topic/oju2 著作权归作者所有。请勿转载和采集!