根据ip和子网掩码判断两个ip是否在同一个子网
2016-09-02 22:26
253 查看
题目描述:
子网掩码的要求:
1)如255.255.255.0
每个整形都不能大于255
转换成二进制的字符串,必须前面全为1,后面全为0
ip地址的要求:
1)第一个整数不能为127(环回地址),不能为0和255
2)四个整数都不能大于255
判断两个ip地址是不是在同一个子网就是判断ip1、ip2分别与mask按位与的结果相同。
示例:
I P 地址 192.168.0.1
子网掩码 255.255.255.0
转化为二进制进行运算:
I P 地址 11010000.10101000.00000000.00000001
子网掩码 11111111.11111111.11111111.00000000
AND运算
11000000.10101000.00000000.00000000
转化为十进制后为:
192.168.0.0
I P 地址 192.168.0.254
子网掩码 255.255.255.0
转化为二进制进行运算:
I P 地址 11010000.10101000.00000000.11111110
子网掩码 11111111.11111111.11111111.00000000
AND运算
11000000.10101000.00000000.00000000
转化为十进制后为:
192.168.0.0
通过以上对两台计算机IP地址与子网掩码的AND运算后,我们可以看到它运算结果是一样的。均为192.168.0.0,所以这二台计算机可视为是同一子网络。
子网掩码的要求:
1)如255.255.255.0
每个整形都不能大于255
转换成二进制的字符串,必须前面全为1,后面全为0
ip地址的要求:
1)第一个整数不能为127(环回地址),不能为0和255
2)四个整数都不能大于255
判断两个ip地址是不是在同一个子网就是判断ip1、ip2分别与mask按位与的结果相同。
示例:
I P 地址 192.168.0.1
子网掩码 255.255.255.0
转化为二进制进行运算:
I P 地址 11010000.10101000.00000000.00000001
子网掩码 11111111.11111111.11111111.00000000
AND运算
11000000.10101000.00000000.00000000
转化为十进制后为:
192.168.0.0
I P 地址 192.168.0.254
子网掩码 255.255.255.0
转化为二进制进行运算:
I P 地址 11010000.10101000.00000000.11111110
子网掩码 11111111.11111111.11111111.00000000
AND运算
11000000.10101000.00000000.00000000
转化为十进制后为:
192.168.0.0
通过以上对两台计算机IP地址与子网掩码的AND运算后,我们可以看到它运算结果是一样的。均为192.168.0.0,所以这二台计算机可视为是同一子网络。
import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String [] args){ Scanner scan = new Scanner(System.in); while(scan.hasNext()){ String mask = scan.next(); String ip1 = scan.next(); String ip2 = scan.next(); if( ( checkIp(transfer(ip1)) && checkIp(transfer(ip2)) && checkMask(transfer(mask))) == false) System.out.println("1"); else { if(checkNetSegment(mask,ip1,ip2)) System.out.println("0"); else System.out.println("2"); } } // System.out.println(checkIp(transfer("192.168.224.256"))); } //判断ip1和ip2是不是在同一个子网 public static boolean checkNetSegment(String mask, String ip1, String ip2){ int[] ipint1 = transfer(ip1); int[] ipint2 = transfer(ip2); int[] maskint = transfer(mask); int len = maskint.length; for(int i = 0; i < len; i++){ // System.out.println(ipint1[i] & maskint[i]); // System.out.println(ipint2[i] & maskint[i]); if( (ipint1[i] & maskint[i]) != (ipint2[i] & maskint[i])) return false; } return true; } //将ip地址字符串转换成整形数组的形式 public static int[] transfer(String ip){ String[] ipstr = ip.split("\\."); int len = ipstr.length; int[] ipint = new int[len]; for(int i = 0; i < len; i++) ipint[i]=0; for(int i = 0; i < len; i++){ ipint[i] = Integer.parseInt(ipstr[i]); } return ipint; } //检查输入的ip地址是否有效 public static boolean checkIp(int[] ipint){ if(ipint.length != 4) return false; if(ipint[0] == 172 || ipint[0] == 0 || ipint[0] >= 255) return false; for(int i = 1; i < 4; i++){ if(ipint[i] > 255) return false; } return true; } //检查输入的子网掩码是否有效,这里用了正则表达式匹配的方法 public static boolean checkMask(int[] maskint){ int length = maskint.length; if(maskint.length > 4) return false; //if(maskint.length < ) for(int i = 0; i < length; i++){ if(maskint[i] > 255) return false; } String mask=""; for(int i = 0; i < length; i++){ String ss = Integer.toBinaryString(maskint[i]); if(ss.length() < 8){ int len = 8 - ss.length(); for(int j = 0; j < len; j++){ ss = "0" + ss; } } mask = mask + ss; } String regx = "^[1]*[0]*$"; Pattern pat = Pattern.compile(regx); Matcher mat = pat.matcher(mask); return mat.matches(); } }
相关文章推荐
- C实现判断两个IP是否在同一个子网
- C实现判断两个IP是否在同一个子网
- 华为oj:判断两个IP是否属于同一个子网
- 华为OJ--判断两个IP是否属于同一个子网
- 华为机试-判断两个IP是否属于同一个子网
- 根据IP和子网掩码,判断ip是否属于子网
- 通过子网掩码判断两个IP是否在同一网段
- php根据ip段以及子网掩码,判断某ip是否处于某子网下
- 华为OJ:判断两个IP是否属于同一子网
- 判断两个IP是否属于同一子网
- 判断两个IP是否属于同一子网
- 判断两个IP是否属于同一子网
- 判断两个IP大小及是否在同一个网段中
- 如判断这两个IP是否属于同一网段?
- 判断两个IP大小及是否在同一个网段中
- win32 判断IP及子网掩码是否合法
- 华为oj_判断两个IP是否属于同一子网
- 判断两个IP是否属于同一子网
- 判断IP及子网掩码是否合法(C语言实现)
- [置顶] 如何判断两个IP大小关系及是否在同一个网段中