您的位置:首页 > 编程语言

根据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,所以这二台计算机可视为是同一子网络。

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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  华为 编程笔试题