近期做了一个远程防火墙的项目,需要根据送过来的IP和子网掩码位数计算子网,做了最简单的实现:
/**
* 根据掩码位数获取子网掩码
*
* @param maskBit
* @return
*/
public static String getMaskByBit(int maskBit) {
String maskIp = "";
if (maskBit > 32 || maskBit < 1)
return maskIp;
String maskBinary = "";
for (int i = 0; i < 32; i++) {
if (i < maskBit)
maskBinary += "1";
else {
maskBinary += "0";
}
}
for (int i = 0; i < 4; i++) {
maskIp += "." + (Integer.parseInt(maskBinary.substring(8 * i, 8 * (i + 1)), 2));
}
return maskIp.replaceFirst(".", "");
}
/**
*
* @Title: getNetSegmentByIp
* @Description: 根据IP计算出子网
* @param: @param
* ip
* @param: @return
* 子网
* @return: String
* @throws null
*/
public static String getNetSegmentByIp(String ip) {
String[] ip_mask = ip.split("/");
String[] ipv4 = ip_mask[0].split("\\.");
int netBit = Integer.parseInt(ip_mask[1]);
String mask = getMaskByBit(netBit);
String[] maskv4 = mask.split("\\.");
String result = "";
for (int i = 0; i < maskv4.length; i++) {
int ipBit = Integer.parseInt(ipv4[i]);
int maskBit = Integer.parseInt(maskv4[i]);
result += "." + (ipBit & maskBit);
}
return result.replaceFirst(".", "") + "/" + netBit;
}
使用时,直接 getNetSegmentByIp("10.1.121.12/16")即可