IPv4地址段、地址掩码、可用地址等常用方法
package com.xxx.iptools;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; public class IPv4Util {
public static void main(String[] args){
String ipAddr="15.10.44.60";
System.out.println("判断字符串是否为IPv4地址:"+isIPv4("24"));
System.out.println("IPv4地址转换为数字:"+ipToInt(ipAddr));
System.out.println("数字转换为IP地址:"+intToIP(252324924));
System.out.println("数字串转换为IP地址:"+intToIP("252324928"));
System.out.println("将掩码位转换为地址:"+maskToIP("8"));
System.out.println("将掩码转换为掩码位:"+maskToBit("255.0.0.0"));
System.out.println("根据IP和掩码计算首地址:"+IPmap("192.168.1.2/24"));
System.out.println("根据IP和掩码计算所有IP地址:"+IPAll("192.168.1.15/28"));
System.out.println("根据IP和掩码计算所有IP十进制值:"+IPnums("192.168.1.15/32"));
System.out.println("两组IP判断包含(bIsContA:B包含A;aIsContB:A包含B)、交集(retainAll)、并集(all)、去重并集(disAll)、差集(diffAll,A有B没有):"+IPColl("192.168.1.1/30","192.168.1.1/31"));
} /**
* 根据IP地址和掩码,获取全量IP列表
* @param ipAddra,ipAddrb
* @return map
*/
public static Map IPColl (String ipAddra,String ipAddrb){
//根据地址信息获取全量十进制IP
List lista=IPnums(ipAddra);
List listb=IPnums(ipAddrb);
Map map=new HashMap();
List list = new ArrayList();
//包含关系判断
Boolean aIsContB=lista.containsAll(listb);
map.put("aIsContB",aIsContB);
Boolean bIsContA=listb.containsAll(lista);
map.put("bIsContA",bIsContA);
//并集,包含重复数据
list = lista;
list.addAll(listb);
map.put("all",listNuToIP(list));
list=null;
//差集,lista对listb的差集,a有b没有的意思
list=lista;
list.removeAll(listb);
map.put("diffAll",listNuToIP(list));
//去重并集:根据上一步的差集,合并第二集合,得到去重并集
list.addAll(listb);
map.put("disAll",listNuToIP(list));
list=null;
//交集:两个list集合的交集
list=lista;
list.retainAll(listb);
map.put("retainAll",listNuToIP(list));
list=null;
return map;
} /**
* 根据十进制IP list列表,获取点分制IP地址
* @param listint
* @return list
*/
public static List listNuToIP (List listint){
List list=new ArrayList();
for (Object ip:listint){
String ips = intToIP(Long.parseLong(ip.toString()));
list.add(ips);
}
return list;
} /**
* 根据IP地址和掩码,获取全量IP列表
* @param ipAddr
* @return list
*/
public static List IPnums (String ipAddr){
List list=new ArrayList();
if (!ipAddr.contains("/")){
list.add(ipToInt(ipAddr));
return list;
}
if (ipAddr.split("/")[1].equals("32") || ipAddr.split("/")[1].equals("255.255.255.255")){
list.add(ipToInt(ipAddr.split("/")[0]));
return list;
}
Map mapIP=IPmap(ipAddr);
Long startIP=ipToInt(mapIP.get("netIP").toString());
Long endIP=ipToInt(mapIP.get("broadIP").toString());
for (Long i=startIP;i<=endIP;i++){
list.add(i);
}
return list;
} /**
* 根据IP地址和掩码,获取全量IP列表
* @param ipAddr
* @return list
*/
public static List IPAll (String ipAddr){
List list=new ArrayList();
if (!ipAddr.contains("/")){
list.add(ipAddr);
return list;
}
if (ipAddr.split("/")[1].equals("32") || ipAddr.split("/")[1].equals("255.255.255.255")){
list.add(ipAddr.split("/")[0]);
return list;
}
Map mapIP=IPmap(ipAddr);
Long startIP=ipToInt(mapIP.get("netIP").toString());
Long endIP=ipToInt(mapIP.get("broadIP").toString());
for (Long i=startIP;i<=endIP;i++){
list.add(intToIP(i));
}
return list;
} /**
* 根据IP地址和掩码计算掩码、网络、广播、起始IP地址
* @param ipAddr
* @return map
*/
public static Map<String,String> IPmap(String ipAddr){
Map<String,String> map=new HashMap<>();
if (!ipAddr.contains("/")){
map.put("startIP",ipAddr);
map.put("maskBit","32");
map.put("maskIP","255.255.255.255");
return map;
}
String ip=ipAddr.split("/")[0];
String maskIP=ipAddr.split("/")[1];
String maskBit="";
if(isIPv4(maskIP)){
maskBit=maskToBit(maskIP);
if (maskBit.equals("32")){
map.put("startIP",ip);
map.put("maskBit","32");
map.put("maskIP","255.255.255.255");
return map;
}
}else{
maskBit=maskIP;
if (maskBit.equals("32")){
map.put("startIP",ip);
return map;
}
maskIP=maskToIP(maskBit);
}
String ip1st = "";
int ipArray[] = new int[4];
int netMaskArray[] = new int[4];
for (int i = 0; i <4; i++) {
ipArray[i] = Integer.parseInt(ip.split("\\.")[i]);
netMaskArray[i] = Integer.parseInt(maskIP.split("\\.")[i]);
ipArray[i] = ipArray[i]&netMaskArray[i];
}
for (int i = 0; i < 4; i++){
if(i == 3){
ipArray[i] = ipArray[i];
}
if ("" == ip1st){
ip1st +=ipArray[i];
} else{
ip1st += "." + ipArray[i];
}
}
map.put("maskBit",maskBit);
map.put("maskIP",maskIP);
map.put("netIP",ip1st);
String broadIP=intToIP(ipToInt(ip1st)+(int)Math.pow(2,32-Integer.parseInt(maskBit))-1);
String end=intToIP(ipToInt(ip1st)+(int)Math.pow(2,32-Integer.parseInt(maskBit))-2);
map.put("broadIP",broadIP);
map.put("endIP",broadIP);
ip1st="";
for (int i = 0; i < 4; i++){
if(i == 3){
ipArray[i] = ipArray[i]+1;
}
if ("" == ip1st){
ip1st +=ipArray[i];
} else{
ip1st += "." + ipArray[i];
}
}
map.put("startIP",ip1st);
return map;
} /**
* 将掩码位转换为地址,入参为字符串
* @param maskIP
* @return String
*/
public static String maskToBit(String maskIP) {
String bitMask="-1";
switch (maskIP){
case "128.0.0.0" : bitMask = "1" ; break;
case "192.0.0.0" : bitMask = "2" ; break;
case "224.0.0.0" : bitMask = "3" ; break;
case "240.0.0.0" : bitMask = "4" ; break;
case "248.0.0.0" : bitMask = "5" ; break;
case "252.0.0.0" : bitMask = "6" ; break;
case "254.0.0.0" : bitMask = "7" ; break;
case "255.0.0.0" : bitMask = "8" ; break;
case "255.128.0.0" : bitMask = "9" ; break;
case "255.192.0.0" : bitMask ="10" ; break;
case "255.224.0.0" : bitMask ="11" ; break;
case "255.240.0.0" : bitMask ="12" ; break;
case "255.248.0.0" : bitMask ="13" ; break;
case "255.252.0.0" : bitMask ="14" ; break;
case "255.254.0.0" : bitMask ="15" ; break;
case "255.255.0.0" : bitMask ="16" ; break;
case "255.255.128.0" : bitMask ="17" ; break;
case "255.255.192.0" : bitMask ="18" ; break;
case "255.255.224.0" : bitMask ="19" ; break;
case "255.255.240.0" : bitMask ="20" ; break;
case "255.255.248.0" : bitMask ="21" ; break;
case "255.255.252.0" : bitMask ="22" ; break;
case "255.255.254.0" : bitMask ="23" ; break;
case "255.255.255.0" : bitMask ="24" ; break;
case "255.255.255.128" : bitMask ="25" ; break;
case "255.255.255.192" : bitMask ="26" ; break;
case "255.255.255.224" : bitMask ="27" ; break;
case "255.255.255.240" : bitMask ="28" ; break;
case "255.255.255.248" : bitMask ="29" ; break;
case "255.255.255.252" : bitMask ="30" ; break;
case "255.255.255.254" : bitMask ="31" ; break;
case "255.255.255.255" : bitMask ="32" ; break;
}
return bitMask;
} /**
* 将掩码位转换为地址,入参为字符串
* @param maskBit
* @return String
*/
public static String maskToIP(String maskBit) {
String ipMask="-1";
switch (maskBit){
case "1" : ipMask = "128.0.0.0"; break;
case "2" : ipMask = "192.0.0.0"; break;
case "3" : ipMask = "224.0.0.0"; break;
case "4" : ipMask = "240.0.0.0"; break;
case "5" : ipMask = "248.0.0.0"; break;
case "6" : ipMask = "252.0.0.0"; break;
case "7" : ipMask = "254.0.0.0"; break;
case "8" : ipMask = "255.0.0.0"; break;
case "9" : ipMask = "255.128.0.0"; break;
case "10" : ipMask = "255.192.0.0"; break;
case "11" : ipMask = "255.224.0.0"; break;
case "12" : ipMask = "255.240.0.0"; break;
case "13" : ipMask = "255.248.0.0"; break;
case "14" : ipMask = "255.252.0.0"; break;
case "15" : ipMask = "255.254.0.0"; break;
case "16" : ipMask = "255.255.0.0"; break;
case "17" : ipMask = "255.255.128.0"; break;
case "18" : ipMask = "255.255.192.0"; break;
case "19" : ipMask = "255.255.224.0"; break;
case "20" : ipMask = "255.255.240.0"; break;
case "21" : ipMask = "255.255.248.0"; break;
case "22" : ipMask = "255.255.252.0"; break;
case "23" : ipMask = "255.255.254.0"; break;
case "24" : ipMask = "255.255.255.0"; break;
case "25" : ipMask = "255.255.255.128"; break;
case "26" : ipMask = "255.255.255.192"; break;
case "27" : ipMask = "255.255.255.224"; break;
case "28" : ipMask = "255.255.255.240"; break;
case "29" : ipMask = "255.255.255.248"; break;
case "30" : ipMask = "255.255.255.252"; break;
case "31" : ipMask = "255.255.255.254"; break;
case "32" : ipMask = "255.255.255.255"; break;
}
return ipMask;
} /**
* 将掩码位转换为地址,入参为数字
* @param maskBit
* @return String
*/
public static String maskToIP(int maskBit) {
String ipMask="-1";
switch (maskBit){
case 1 : ipMask = "128.0.0.0"; break;
case 2 : ipMask = "192.0.0.0"; break;
case 3 : ipMask = "224.0.0.0"; break;
case 4 : ipMask = "240.0.0.0"; break;
case 5 : ipMask = "248.0.0.0"; break;
case 6 : ipMask = "252.0.0.0"; break;
case 7 : ipMask = "254.0.0.0"; break;
case 8 : ipMask = "255.0.0.0"; break;
case 9 : ipMask = "255.128.0.0"; break;
case 10 : ipMask = "255.192.0.0"; break;
case 11 : ipMask = "255.224.0.0"; break;
case 12 : ipMask = "255.240.0.0"; break;
case 13 : ipMask = "255.248.0.0"; break;
case 14 : ipMask = "255.252.0.0"; break;
case 15 : ipMask = "255.254.0.0"; break;
case 16 : ipMask = "255.255.0.0"; break;
case 17 : ipMask = "255.255.128.0"; break;
case 18 : ipMask = "255.255.192.0"; break;
case 19 : ipMask = "255.255.224.0"; break;
case 20 : ipMask = "255.255.240.0"; break;
case 21 : ipMask = "255.255.248.0"; break;
case 22 : ipMask = "255.255.252.0"; break;
case 23 : ipMask = "255.255.254.0"; break;
case 24 : ipMask = "255.255.255.0"; break;
case 25 : ipMask = "255.255.255.128"; break;
case 26 : ipMask = "255.255.255.192"; break;
case 27 : ipMask = "255.255.255.224"; break;
case 28 : ipMask = "255.255.255.240"; break;
case 29 : ipMask = "255.255.255.248"; break;
case 30 : ipMask = "255.255.255.252"; break;
case 31 : ipMask = "255.255.255.254"; break;
case 32 : ipMask = "255.255.255.255"; break;
}
return ipMask;
} /**
* 将数字转换为IPv4地址
* @param intIPv4
* @return String
*/
public static String intToIP(long intIPv4) {
return ((intIPv4 >> 24) & 0xFF) +
"." + ((intIPv4 >> 16) & 0xFF) +
"." + ((intIPv4 >> 8) & 0xFF) +
"." + (intIPv4 & 0xFF);
} /**
* 将数字转换为IPv4地址
* @param intIPv4
* @return String
*/
public static String intToIP(String intIPv4) {
Long ip=Long.parseLong(intIPv4);
return ((ip >> 24) & 0xFF) +
"." + ((ip >> 16) & 0xFF) +
"." + ((ip >> 8) & 0xFF) +
"." + (ip & 0xFF);
} /**
* 将IPv4地址转换为数字
* @param ipAddr
* @return long
*/
public static Long ipToInt(String ipAddr){
long ipInt = 0;
String[] ipAddrArray = ipAddr.split("\\.");
for (int i = 3;i>=0;i--){
long ip=Long.parseLong(ipAddrArray[3-i]);
ipInt |=ip<<(i*8);
}
return ipInt;
} /**
* 判断IPv4地址是否合法
* @param ipAddr
* @return boolean
*/
public static boolean isIPv4(String ipAddr){
boolean isIP=ipAddr.matches("([1-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}");
return isIP; } /**
* 判断IPv4掩码是否合法
* @param mask
* @return boolean
*/
public static boolean isMask(String mask){
String isMask=maskToBit(mask);
if ("-1".equals(isMask)){
return false;
}
return true;
}
}
IPv4地址段、地址掩码、可用地址等常用方法的更多相关文章
- ipv4理论知识1-ipv4介绍,ipv4记法,地址段个数算法
定义 在TCP/IP协议中,用于在IP层识别连接到因特网设备的标识符称为因特网地址或IP地址.IPv4地址是一个32位的地址. 地址空间 像IPv4这种定义了地址的协议都有一个地址空间.地址空间就是协 ...
- JAVA和C#检测IP地址段是否交叉和获取地址段IP列表的方法
一.说明 我们经常编程时,需要对一个DIDR地段计算其可用IP地址,或者验证某个IP是否被包含在一个地址段中. 二.工具 1.Java 可以使用 cidr-ip-trie库解决. https://gi ...
- 【网络基础】【TCP/IP】私有IP地址段
私有IP地址段 Class A:10.0.0.0 - 10.255.255.255 Class B:172.16.0.0 - 172.31.255.255 Class C:192.168.0. ...
- 实例讲解ip地址、子网掩码、可用地址范围的计算
关于ip以及相关的掩码.网络号等概念可以查看相关的博客.资料,这些东西很容易找着,一搜一大片.本文主要记录通过实例进行ip相关的计算. 我自己使用的在线网络计算器地址:https://www.sojs ...
- 分享dubbo.xsd和idubbo.xsd的可用地址
dubbo.xsd和idubbo.xsd的官方地址不可用 http://code.alibabatech.com/schema/dubbo/dubbo.xsd似乎挂了,真是淡淡的忧伤啊,然后就各种报错 ...
- 手机号段、ip地址归属地大全,最新手机号段归属地,IP地址归属地数据库
百事通:http://www.114best.com/dh/114.aspx?w=17097232323,联通识别为电信的,1349错 二三四五:http://tools.2345.com/frame ...
- 封了1000多个IP地址段,服务器现在坚如磐石,对付几个小毛贼还是很轻松的
封了1000多个IP地址段,服务器现在坚如磐石 root登陆权限取消,防火墙装上,关闭所有没必要的端口,外层加装路由器映射, 修改常用端口,将常用端口改成陷阱程序,只要访问我这些陷阱端口,程序直接dr ...
- 这两周服务器被攻击,封锁了600多个IP地址段后今天服务器安静多了
这两周服务器被攻击,封锁了600多个IP地址段后今天服务器安静多了 建议大家在自己的服务器上也封杀这些瘪三的地址 iptables -I INPUT -s 123.44.55.0/24 -j DROP ...
- ArcGIS Desktop 10.1+ArcEngine10.1完全破解安装教程(含下载地址+亲测可用!)
最近在二次开发中用到了VS2010+ArcGIS的二次开发模式,因为之前的某些原因,对ArcGIS的接触甚少.初次安装也遇到了很多问题,这里做一个总结. 系统环境 win732位操作系统 需要文件 ( ...
- cidr地址段
CIDR采用各种长度的"网络前缀"来代替分类地址中的网络号和子网号,其格式为:IP地址 = {<网络前缀>,<主机号>}.为了区分网络前缀,通常采用&quo ...
随机推荐
- RCNN论文阅读笔记
一摘要: 两个主要工作:1将cnn和自上而下的区域提案结合进行定位和对象分割:2当训练数据稀缺时,先预训练然后微调. rccn工作分为四步:1输入一张图片 2用selective search算法对每 ...
- The Modules of Event-driven
常用的时间驱动模型(Windows和Linux都有)有三种: 1.select 对于读(Read)事件.写(Write)事件和异常(Exception)事件分别创建事件描述符集合,分别用来收集读事件的 ...
- 用Python演奏音乐
目录 背景 准备 安装mingus 下载并配置fluidsynth 下载soundfont文件 分析 乐谱格式 乐谱解析 弹奏音乐 添加伴奏 保存音乐 完整程序 背景 笔者什么乐器也不会,乐理知识也只 ...
- bzoj4300绝世好题
bzoj4300绝世好题 题意: 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0.n≤100000,ai≤10^9. 题解: 用f[i]表示当前二进制i为1 ...
- CentOS 7 内核RPM方式升级
RPM包下载地址: https://elrepo.org/linux/kernel/el7/x86_64/RPMS/ 选择lt版本(长期支持) #下载内核RPM包,这里是kernel-lt-4.4.- ...
- web自动化测试实战之批量执行测试用例
01实战之分离测试固件 在UI 自动化测试中,不管编写哪个模块的测试用例,都需要首先在测试类中编写测试固件初始化WebDriver类及打开浏览器,执行登录,才能进行下一步业务逻辑的操作,测试用例执行完 ...
- Python实现性能自动化测试的方法【推荐好文】
1.什么是性能自动化测试? ◆ 性能 △ 系统负载能力 △ 超负荷运行下的稳定性 △ 系统瓶颈 ◆ 自动化测试 △ 使用程序代替手工 △ 提升测试效率 ◆ 性能自动化 △ 使用代码模拟大批量用户 △ ...
- 性能测试必备知识(2)- 查看 Linux 的 CPU 相关信息
做性能测试的必备知识系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1806772.html 查看系统 CPU 信息 cat /proc/ ...
- 一张PDF了解JDK11 GC调优秘籍-附PDF下载
目录 简介 废弃的VM选项 Source-File Mode Code Heap状态分析 AppCDS 总结 简介 JDK11相比JDK10,添加了一个新的Source-File Mode,可以直接通 ...
- DNA Consensus String UVA - 1368
题目链接:https://vjudge.net/problem/UVA-1368 题意:给出一组字符串,求出一组串,使与其他不同的点的和最小 题解:这个题就是一个点一个点求,利用桶排序,求出最多点数目 ...