博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IP查找所属网段
阅读量:6714 次
发布时间:2019-06-25

本文共 3234 字,大约阅读时间需要 10 分钟。

最近同学接到阿里面试题

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"),返回12313     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
dataMap = new HashMap
();15 16 @Override17 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 @Override39 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 }

 

转载地址:http://wdalo.baihongyu.com/

你可能感兴趣的文章
Docker之Linux UnionFS
查看>>
基于 WebGL 3D 的 HTML5 档案馆可视化管理系统
查看>>
c#枚举转化示例大全,数字或字符串转枚举
查看>>
Java 性能优化 - Sun Hotspot JDK JVM 参数设置
查看>>
C++中单例模式对象的释放控制
查看>>
【你必须知道的.NET】:【大话String】
查看>>
android屏蔽返回键和home键
查看>>
Bash shell(五)-数据流重导向
查看>>
分享20个超酷的酒店类网站设计
查看>>
Ext.Net 1.2.0/Ext JS_用 Ext JS 遍历查找过滤检索 Ext.Net.Store 检索
查看>>
Apache CouchDB 1.2.0新特性
查看>>
更优美的javaScript(2)
查看>>
WCF服务编程 学习笔记(1)
查看>>
关于黑衣人3结尾时插曲K哼的歌名|Empire State Of Mind歌词中文翻译
查看>>
ROLLUP实现的分级汇总示例(带排序处理).sql
查看>>
用C#通过反射实现动态调用WebService 告别Web引用
查看>>
设计模式之八:外观模式(Facade)
查看>>
.Net魔法堂:开启IIS的WebGarden、WebFarm和StateServer之旅
查看>>
Sumsets(3sum问题,枚举d,c二分a+b)
查看>>
Implementing dm-verity
查看>>