1、一个网段内,除去网络地址和广播地址外,其它剩余地址都为可用地址。
其中网络地址为:ip地址与掩码与出来的地址
广播地址为:网段的主机位全1的地址
2、java实现:
获取广播地址:
/** 例如:ip:172.31.2.35,netmask:255.255.255.0
* 根据IP和子网掩码,计算子网广播地址
* @param ip
* @param netmask子网掩码
* @return
*/
public String getBroadcastAddress(String ip,String netmask) {
String[] ips = ip.split("\\.");
String[] masks = netmask.split("\\.");
StringBuffer sb = new StringBuffer();
for(int i = 0; i < ips.length; i++) {
ips[i] = String.valueOf((~Integer.parseInt(masks [i]))|(Integer.parseInt(ips[i])));
sb.append(turnToStr(Integer.parseInt(ips[i])));
if(i != (ips.length-1))
sb.append(".");
}
return turnToIp(sb.toString());
}
/**
* 把带符号整形转换为二进制
* @param num
* @return
*/
private String turnToStr(int num) {
String str = "";
str = Integer.toBinaryString(num);
int len = 8 - str.length();
// 如果二进制数据少于8位,在前面补零.
for (int i = 0; i < len; i++) {
str = "0" + str;
}
//如果num为负数,转为二进制的结果有32位,如1111 1111 1111 1111 1111 1111 1101 1110
//则只取最后的8位.
if (len < 0)
str = str.substring(24, 32);
return str;
}
/**
* 把二进制形式的ip,转换为十进制形式的ip
* @param str
* @return
*/
private String turnToIp(String str){
String[] ips = str.split("\\.");
StringBuffer sb = new StringBuffer();
for (int i = 0; i < ips.length; i++) {
sb.append(turnToInt(ips[i]));
sb.append(".");
}
sb.deleteCharAt(sb.length() - 1);
return sb.toString();
}
/**
* 把二进制转换为十进制
* @param str
* @return
*/
private int turnToInt(String str){
int total = 0;
int top = str.length();
for (int i = 0; i < str.length(); i++) {
String h = String.valueOf(str.charAt(i));
top--;
total += ((int) Math.pow(2, top)) * (Integer.parseInt(h));
}
return total;
}
}