IP查找所属网段
最近同学接到阿里面试题
package io.guangsoft.analysis; /*
数据文件:
1.1.1.0/24,123
1.1.2.0/28,345
1.2.0.0/16,789
*/
public interface Finder {
//完成初始化动作
boolean loadFile(String fileName);
//查找具体IP所在IP网段的键值,未找到返回-1;比如如果输入样例数据文件,调用find("1,1,1,1"),返回123
int find(String ipStr);
}
搜索一番解答如下
package io.guangsoft.analysis; import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.HashMap;
import java.util.Map; import org.apache.commons.net.util.SubnetUtils;
import org.apache.commons.net.util.SubnetUtils.SubnetInfo; public class FinderImpl implements Finder { private Map<String, String> dataMap = new HashMap<String, String>(); @Override
public boolean loadFile(String fileName) {
File file = new File(this.getClass().getClassLoader().getResource(fileName).getFile());
try {
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
while(true) {
String nextLine = bufferedReader.readLine();
if(nextLine == null) {
break;
} else {
String str[] = nextLine.split(",");
dataMap.put(str[0], str[1]);
}
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
} @Override
public int find(String ip) {
for(String network : dataMap.keySet()) {
boolean bingo = isInRange(ip, network);
if(bingo) {
return Integer.parseInt(dataMap.get(network));
}
}
return -1;
} //核心代码,检索IP所属网段
public boolean isInRange(String ip, String network) {
String[] ips = ip.split("\\.");
int ipAddr = (Integer.parseInt(ips[0]) << 24)
| (Integer.parseInt(ips[1]) << 16)
| (Integer.parseInt(ips[2]) << 8)
| Integer.parseInt(ips[3]);
int type = Integer.parseInt(network.replaceAll(".*/", ""));
int mask = 0xFFFFFFFF << (32 - type);
String networkIp = network.replaceAll("/.*", "");
String[] networkIps = networkIp.split("\\.");
int networkIpAddr = (Integer.parseInt(networkIps[0]) << 24)
| (Integer.parseInt(networkIps[1]) << 16)
| (Integer.parseInt(networkIps[2]) << 8)
| Integer.parseInt(networkIps[3]);
return (ipAddr & mask) == (networkIpAddr & mask);
} //也可以使用apache的net工具类
public boolean isInRange2(String ip, String network) {
SubnetInfo subnetInfo = new SubnetUtils(network).getInfo();
return subnetInfo.isInRange(ip);
} public static void main(String args[]) {
FinderImpl finder = new FinderImpl();
if(finder.loadFile("data.txt")) {
int num = finder.find("1.1.1.1");
System.out.println(num);
}
} }
IP查找所属网段的更多相关文章
- 使用二分查找判断某个数在某个区间中--如何判断某个IP地址所属的地区
一,问题描述 给定100万个区间对,假设这些区间对是互不重叠的,如何判断某个数属于哪个区间? 首先需要对区间的特性进行分析:区间是不是有序的?有序是指:后一个区间的起始位置要大于前一个区间的终点位置. ...
- (转)如何使VMware ip与本机ip处于同一网段
如何使VMware ip与本机ip处于同一网段 原创 2017年05月08日 17:28:56 1287 首先确认本机ip 可以看出一下信息: 本机ip: 192.168.1.162 网关:192. ...
- 谢欣伦 - OpenDev原创教程 - 本地IP查找类CxLocalHostIPAddrFind
这是一个精练的本地IP查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxLocalHostIPAddrFind的使用如下: ...
- PHP ip 查找 城市名
PHP ip 查找 城市名 header("content-type:text/html;charset=utf-8");date_default_timezone_set(&qu ...
- .NET(C#)调用webService获取客户端IP地址所属区域(非异步)
功能描述: 此接口用于获取客户端访问的IP的地址所属的区域(国家,城市等).通过输入IP地址查询国家.城市.所有者等信息.没有注明国家的为中国输入参数:IP地址(自动替换 " ." ...
- 网络基础 图解Windows系统下单网卡设置双IP访问不同网段的方法
图解Windows系统下单网卡设置双IP访问不同网段的方法 by:授客 QQ:1033553122 在Windows系统下即使只有一块网卡,同样可以实现双IP访问不同网段. 例: 外网信息: IP:1 ...
- 关于A类,B类,C类IP地址的网段和主机数的计算方法
关于A类,B类,C类IP地址的网段和主机数的计算方法 IP地址是一个32位的二进制数,由四个八位字段组成.每个IP地址包括两部分:一部分为网络标识(网络号),一部分为主机标识(主机号). A类地址前8 ...
- 5.如何使主机和虚拟机IP处于同一网段(内网渗透专用)
先说一下正常流程: 1.打开虚拟机网络设置选项,选择桥接模式(Bridged)[如果是Kali 2.0的话,执行第一步后就OK了(90%)] 2.打开Kali里面的网络设置 3.设置一个ip4或者ip ...
- IP查找工具——angry IP Scanner
作用] 若树莓派没有屏幕可通过该工具查找树莓派的IP地址.例如下图的树莓派IP地址可能为192.168.1.107. 图1 IP scan查找树莓派IP地址
随机推荐
- Struts2数据验证与使用Java代码进行数据验证
Struts2数据验证 使用Java代码进行数据验证 重写ActionSupport的validate()方法 对Action类的中所有请求处理方法都会进行验证! 对Action类的数据属性进行检查, ...
- Zabbix低级主动发现之MySQL多实例
接上篇:Zabbix自动发现与主动注册 在一个agent安装一个maraidb 拷贝一个原始配置文档并且修改配置用于开启多实例 按照配置文件初始化数据库 mysql_install_db --user ...
- 2017-2018-2 20165330实验二《Java面向对象程序设计》实验报告
实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步骤 (一)单元测试 三种代码 伪代码:从意图层面来解 ...
- CLR via 笔记4.2 类型转换 is 与 as 区别
is 和 as 操作符是用来进行强制类型转换的 is : 检查一个对象是否兼容于其他指定的类型,并返回一个Bool值,永远不会抛出异常 object o = new object(); if (o i ...
- 新团建立时间 timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
w 不根据当前时间戳更新. `wtime` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
- 部署本地gitlab
一.gitlab简介 GitLab是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目.它拥有与Github类似的功能 ...
- 剑指Offer——机器人的运动范围
题目描述: 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器人 ...
- appium+python自动化测试真机测试时报错“info: [debug] Error: Could not extract PIDs from ps output. PIDS: [], Procs: ["bad pid 'uiautomator'"]”
刚开始启动服务时,弹出授权提示,以为是手机app权限问题,后来debug后,发现了一个警告日志:UiAutomator did not shut down fast enough, calling i ...
- MobileNet
MobileNet (Efficient Convolutional Neural Networks for Mobile Vision Applications)--Google CVPR-2017 ...
- Java设计模式-简单工厂模式(Static Factory Method)
简单工厂模式(Static Factory Method) 简单工厂模式是类的创建模式,又叫静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂对象决定创建出哪一种 ...