将IP地址 和 掩码 进行与运算,可得出该IP地址所在的网段。
1、首先将IP地址、掩码换算成二进制数字
220.193.128.9 11011100.11000001.10000000.00001001
255.255.255.240 11111111.11111111.11111111.11110000
2、将两组二进制对应的第一位乘第一位,第二位乘第二位......类推
得出: 11011100.11000001.10000000.00000000
3、再转为十进制即:220.193.128.0
再用同样的方法算220.193.128.14所在的网段,会也是220.193.128.0
因此两个IP位于同一网段中。
其实计算多了,用口算就可以算出来结果。
/*
* 判断ip是否在一个网段(局域网)
* 用ip地址逻辑且子网掩码
*/
public boolean isIPAtSameSection(String ip1, String ip2) {
if (TextUtils.isEmpty(ip1) || TextUtils.isEmpty(ip2)) {
return false;
}
ip1 = ip1.trim();
ip2 = ip2.trim();
String subnetmask = getSubnetMask().trim();
String[] ip1s = new String[4];
String[] ip2s = new String[4];
String[] subnetmasks = new String[4];
String[] ipResult1s = new String[4];
String[] ipResult2s = new String[4];
ip1s = ip1.split("\\.");
ip2s = ip2.split("\\.");
subnetmasks = subnetmask.split("\\.");
for (int i = 0; i < ip1s.length; ++i) {
ipResult1s[i] = String.valueOf(Integer.parseInt(ip1s[i]) & Integer.parseInt(subnetmasks[i]));
}
for (int i = 0; i < ip2s.length; ++i) {
ipResult2s[i] = String.valueOf(Integer.parseInt(ip2s[i]) & Integer.parseInt(subnetmasks[i]));
}
String newIp1 = ipResult1s[0] + ipResult1s[1] + ipResult1s[2] + ipResult1s[3];
String newIp2 = ipResult2s[0] + ipResult2s[1] + ipResult2s[2] + ipResult2s[3];
if (newIp1 != null && newIp2 != null && newIp1.equals(newIp2)) {
return true;
}
return false;
}
// 返回当前手机网卡的子网掩码
private String getSubnetMask() {
WifiManager wifi = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
DhcpInfo dhcp = wifi.getDhcpInfo();
String ret = intToIp(dhcp.netmask);
return ret;
}
// IP地址或网关都是
private String intToIp(int paramInt) {
return (paramInt & 0xFF) + "." + (0xFF & paramInt >> 8) + "."
+ (0xFF & paramInt >> 16) + "." + (0xFF & paramInt >> 24);
}