IPアドレスが1つのセグメント(ローカルエリアネットワーク)にあるかどうかを判断する

2084 ワード

IPアドレスとマスクを演算し、そのIPアドレスが存在するセグメントを導出する.1、まずIPアドレス、マスクを2進数220.193.128.9 11011100.1100000.000010010010000010010010000001255.255.255.255.240111111.11111111111111.11111111111111.111100002に換算し、2組の2進数に対応する1位を1位に乗じ、2位を2位に乗じる…類推によると、11011100.110000001.1100000.00000003、再10進法に移行すると、220.193.128.0と同じ方法で220.193.128.14のネットワークセグメントが計算され、220.193.128.0になるため、2つの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);
	}