IP查找所属网段


最近同学接到阿里面试题

 1 package io.guangsoft.analysis;  2 
 3 /*
 4  数据文件:  5  1.1.1.0/24,123  6  1.1.2.0/28,345  7  1.2.0.0/16,789  8  */
 9 public interface Finder { 10     //完成初始化动作
11     boolean loadFile(String fileName); 12     //查找具体IP所在IP网段的键值,未找到返回-1;比如如果输入样例数据文件,调用find("1,1,1,1"),返回123
13     int find(String ipStr); 14 }

搜索一番解答如下

 1 package io.guangsoft.analysis;  2 
 3 import java.io.BufferedReader;  4 import java.io.File;  5 import java.io.FileReader;  6 import java.util.HashMap;  7 import java.util.Map;  8 
 9 import org.apache.commons.net.util.SubnetUtils; 10 import org.apache.commons.net.util.SubnetUtils.SubnetInfo; 11 
12 public class FinderImpl implements Finder { 13 
14     private Map<String, String> dataMap = new HashMap<String, String>(); 15     
16  @Override 17     public boolean loadFile(String fileName) { 18         File file = new File(this.getClass().getClassLoader().getResource(fileName).getFile()); 19         try { 20             FileReader fileReader = new FileReader(file); 21             BufferedReader bufferedReader = new BufferedReader(fileReader); 22             while(true) { 23                 String nextLine = bufferedReader.readLine(); 24                 if(nextLine == null) { 25                     break; 26                 } else { 27                     String str[] = nextLine.split(","); 28                     dataMap.put(str[0], str[1]); 29  } 30  } 31         } catch (Exception e) { 32  e.printStackTrace(); 33             return false; 34  } 35         return true; 36  } 37 
38  @Override 39     public int find(String ip) { 40         for(String network : dataMap.keySet()) { 41             boolean bingo = isInRange(ip, network); 42             if(bingo) { 43                 return Integer.parseInt(dataMap.get(network)); 44  } 45  } 46         return -1; 47  } 48     
49     //核心代码,检索IP所属网段
50     public boolean isInRange(String ip, String network) { 51         String[] ips = ip.split("\\."); 52         int ipAddr = (Integer.parseInt(ips[0]) << 24) 53                 | (Integer.parseInt(ips[1]) << 16) 54                 | (Integer.parseInt(ips[2]) << 8) 55                 | Integer.parseInt(ips[3]); 56         int type = Integer.parseInt(network.replaceAll(".*/", "")); 57         int mask = 0xFFFFFFFF << (32 - type); 58         String networkIp = network.replaceAll("/.*", ""); 59         String[] networkIps = networkIp.split("\\."); 60         int networkIpAddr = (Integer.parseInt(networkIps[0]) << 24) 61                 | (Integer.parseInt(networkIps[1]) << 16) 62                 | (Integer.parseInt(networkIps[2]) << 8) 63                 | Integer.parseInt(networkIps[3]); 64          return (ipAddr & mask) == (networkIpAddr & mask); 65  } 66     
67     //也可以使用apache的net工具类
68     public boolean isInRange2(String ip, String network) { 69         SubnetInfo subnetInfo = new SubnetUtils(network).getInfo(); 70         return subnetInfo.isInRange(ip); 71  } 72     
73     public static void main(String args[]) { 74         FinderImpl finder = new FinderImpl(); 75         if(finder.loadFile("data.txt")) { 76             int num = finder.find("1.1.1.1"); 77  System.out.println(num); 78  } 79  } 80     
81 }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM