子网划分
代码
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小时内删除。