1. 功能:
输入一个子网中的ip和子网掩码,可以获取:
- 起始ip
- 结束ip
- 子网中所有ip集合
2. 代码
import java.util.*;
public class IpUtil {
/**
* 测试
* @param args
*/
public static void main(String[] args) {
String ip = "10.10.2.23";
String netmask = "255.255.255.0";
System.out.println("子网中的一个ip是:" + ip + " ,子网掩码是: " + netmask );
//以0结尾的一般表示网络地址,255结尾的是广播地址,
//我们用的IP地址是1~254结尾之间的,这儿不处理
String ipStartString = getStartIpOfSubnet(ip, netmask);
String ipEndString = getEndIpOfSubnet(ip, netmask);
System.out.println("起始ip是:" + ipStartString);
System.out.println("结束ip是:" + ipEndString);
for (String subnetIp : getIpSetOfSubnet(ip,netmask)){
System.out.println(subnetIp);
}
}
/**
* 获取网络中起始ip
* @param ip 子网中的一个ip
* @param netmask 子网掩码
* @return 起始ip
*/
public static String getStartIpOfSubnet(String ip, String netmask){
return getStartIpOfSubnet(ipToInt(ip), ipToInt(netmask));
}
private static String getStartIpOfSubnet(int ip, int netmask){
return intToIP(ip & netmask);
}
/**
* 获取网络中结束ip
* @param ip 子网中的一个ip
* @param netmask 子网掩码
* @return 结束ip
*/
public static String getEndIpOfSubnet(String ip, String netmask){
return getEndIpOfSubnet(ipToInt(ip), ipToInt(netmask));
}
private static String getEndIpOfSubnet(int ip, int netmask){
return intToIP(ipToInt(getStartIpOfSubnet(ip,netmask)) + (~netmask));
}
/**
* 获取子网所有ip集合
* @param ip 子网中的一个ip
* @param netmask 子网掩码
* @return 子网所有ip集合
*/
public static Set<String> getIpSetOfSubnet(String ip, String netmask){
int startIp = ipToInt(getStartIpOfSubnet(ip, netmask));
int endIp = ipToInt(getEndIpOfSubnet(ip, netmask));
Set<String> ipSet = new LinkedHashSet<String>();
for (int i = startIp; i <= endIp; i++){
ipSet.add(intToIP(i));
}
return ipSet;
}
/**
* ip字符串转整数
* @param strIP ip字符串形式
* @return ip整数形式
*/
public static int ipToInt(String strIP) {
int[] ip = new int[4];
String[] ipSec = strIP.split("\\.");
for (int k = 0; k < 4; k++) {
ip[k] = Integer.valueOf(ipSec[k]);
}
return (ip[0] << 24) + (ip[1] << 16) + (ip[2] << 8) + ip[3];
}
/**
* ip整数转字符串
* @param intIP ip整数形式
* @return ip字符串形式
*/
public static String intToIP(int intIP) {
StringBuffer sb = new StringBuffer("");
sb.append(String.valueOf(intIP >>> 24));
sb.append(".");
sb.append(String.valueOf((intIP & 0x00FFFFFF) >>> 16));
sb.append(".");
sb.append(String.valueOf((intIP & 0x0000FFFF) >>> 8));
sb.append(".");
sb.append(String.valueOf(intIP & 0x000000FF));
return sb.toString();
}
}