zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    MySQL中tinytext、text、mediumtext和longtext详解
    端口冲突
    Form绑定
    Uri绑定
    只绑定Get参数
    Linux:Day4(上) 文件管理、管道
    selenium之frame
    selenium之选项卡管理
    Request
    爬虫常用库
  • 原文地址:https://www.cnblogs.com/guanghe/p/9525596.html
Copyright © 2011-2022 走看看