子网划分
代码
Java代码下载 github/ALI1416/java
Python代码下载 github/ALI1416/python
Java代码
package net;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class SubnettingAWT {
public static void main(String[] args) {
JFrame f = new JFrame("子网划分");
JPanel p1 = new JPanel();
JTextField tf = new JTextField(10);
JPanel p2 = new JPanel();
JLabel jl = new JLabel("暂无提示信息");
JButton jb = new JButton("确定");
p1.setLayout(new GridLayout(2, 1));
p1.add(new JLabel("请输入IP地址/子网掩码/需求子网数量"));
p1.add(new JLabel("例如:192.168.1.0/24/8"));
p2.setLayout(new GridLayout(2, 1));
p2.add(jb);
p2.add(jl);
f.add(p1, "North");
f.add(tf, "Center");
f.add(p2, "South");
tf.setFont(new Font("微软雅黑", Font.PLAIN, 40));
jb.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
jl.setText(Text()));
}
});
f.setBounds(200, 200, 500, 200);
f.setVisible(true);
f.setDefaultCloseOperation(3);
}
public static String subnet(String str) {
/**
* 初始化部分
*/
int i, j, k, t;
// String str = "1.1.0.0/16/32";// 初始化网络号、子网掩码、需求子网数量
/**
* 切割网络号、子网掩码、子网数量
*/
String temp[] = str.split("/");
if (temp.length != 3) {
System.out.println("输入不合法!程序终止!");
return "输入不合法!程序终止!";
}
/**
* 转换子网掩码、子网数量
*/
int subnetMask = 0;// 子网掩码
int subnetNumber = 0;// 子网数量
try {
subnetMask = Integer.parseInt(temp[1]);
subnetNumber = Integer.parseInt(temp[2]);
if (subnetMask < 2 || subnetNumber < 2) {
System.out.println("子网掩码、子网数量至少为2!程序终止!");
return "子网掩码、子网数量至少为2!程序终止!";
}
} catch (Exception e) {
System.out.println("子网掩码或子网数量格式错误!程序终止!");
return "子网掩码或子网数量格式错误!程序终止!";
}
python转java代码 /**
* 切割、转换网络号到十进制
*/
String temp2[] = temp[0].split("\\.");
if (temp2.length != 4) {
System.out.println("网络号不合法!程序终止!");
return "网络号不合法!程序终止!";
}
int ip10[] = new int[4];// 初始化每一段IP地址,十进制
try {
for (i = 0; i < 4; i++) {// 转为整形
ip10[i] = Integer.parseInt(temp2[i]);
if (ip10[i] < 0 || ip10[i] > 255) {
System.out.println("网络号不合法!程序终止!");
return "网络号不合法!程序终止!";
}
}
} catch (Exception e) {
System.out.println("网络号格式错误!程序终止!");
return "网络号格式错误!程序终止!";
}
/**
* 转换网络号到二进制
*/
int ip2[] = new int[32];// 初始化每一位IP地址,二进制
int flag = 0;// 标记是否停止计算网络前缀
int preNet = 32;// 网络前缀个数(32-从后往前数,第一个不为0的数字)
k = 31;
for (i = 3; i >= 0; i--) {// 转为二进制,并保存到数组
for (j = 0; j < 8; j++) {
ip2[k] = ip10[i] >> j & 1;// >>运算,右移n位,高位补0
k--;
if (flag == 0 && ip2[k + 1] == 0) {// 计算网络前缀
preNet--;
} else {
flag = 1;
}
}
}
if (subnetMask < preNet) {
System.out.println("该网络号的子网掩码不合法!程序终止!");
return "该网络号的子网掩码不合法!程序终止!";
}
if ((1 << (32 - subnetMask)) < subnetNumber) {// 子网数不可超过主机数量
// <<运算,左移n位,相当于2的n次方
System.out.println("需求子网数超出最大主机数量!程序终止!");
return "需求子网数超出最大主机数量!程序终止!";
}
/**
* 计算应当划分的子网数量和每个子网的最大主机数量
*/
int realSubnetNumber = subnetNumber - 1;// 假设输入的子网数量为2的幂次方
// 此处-1是为了正好是2的幂的情况,1是例外,但是上面已经排除
int pow = 1;// 应该为2的几次幂
while ((realSubnetNumber = realSubnetNumber >> 1) != 0) {// 相当于a=a/2,a/2!=0
pow++;
}
realSubnetNumber = 1 << pow;
int maxHost = 1 << (32 - preNet - pow);// 每个子网的最大主机数量
/**
* 分配ip
*/
int preIp[][] = new int[realSubnetNumber][4];// 第一个ip
int sufIp[][] = new int[realSubnetNumber][4];// 最后一个ip
for (i = 0; i < realSubnetNumber; i++) {
/** 设置子网号 */
for (j = 0; j < pow; j++) {// 子网号,递增
ip2[subnetMask + pow - j - 1] = i >> j & 1;
}
/** 设置第一个ip */
Arrays.fill(ip2, subnetMask + pow, 32, 0);// 填充0
for (j = 0; j < 4; j++) {// 计算每一段IP地址,十进制
t = 0;// 计算数组对应的值
for (k = 0; k < 8; k++) {
t += ip2[(j << 3) + k] << (7 - k);
}
preIp[i][j] = t;// 第一个ip
}
/** 设置最后一个ip */
Arrays.fill(ip2, subnetMask + pow, 32, 1);// 填充1
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论