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地址段、地址掩码、可用地址等常用方法的更多相关文章

  1. ipv4理论知识1-ipv4介绍,ipv4记法,地址段个数算法

    定义 在TCP/IP协议中,用于在IP层识别连接到因特网设备的标识符称为因特网地址或IP地址.IPv4地址是一个32位的地址. 地址空间 像IPv4这种定义了地址的协议都有一个地址空间.地址空间就是协 ...

  2. JAVA和C#检测IP地址段是否交叉和获取地址段IP列表的方法

    一.说明 我们经常编程时,需要对一个DIDR地段计算其可用IP地址,或者验证某个IP是否被包含在一个地址段中. 二.工具 1.Java 可以使用 cidr-ip-trie库解决. https://gi ...

  3. 【网络基础】【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. ...

  4. 实例讲解ip地址、子网掩码、可用地址范围的计算

    关于ip以及相关的掩码.网络号等概念可以查看相关的博客.资料,这些东西很容易找着,一搜一大片.本文主要记录通过实例进行ip相关的计算. 我自己使用的在线网络计算器地址:https://www.sojs ...

  5. 分享dubbo.xsd和idubbo.xsd的可用地址

    dubbo.xsd和idubbo.xsd的官方地址不可用 http://code.alibabatech.com/schema/dubbo/dubbo.xsd似乎挂了,真是淡淡的忧伤啊,然后就各种报错 ...

  6. 手机号段、ip地址归属地大全,最新手机号段归属地,IP地址归属地数据库

    百事通:http://www.114best.com/dh/114.aspx?w=17097232323,联通识别为电信的,1349错 二三四五:http://tools.2345.com/frame ...

  7. 封了1000多个IP地址段,服务器现在坚如磐石,对付几个小毛贼还是很轻松的

    封了1000多个IP地址段,服务器现在坚如磐石 root登陆权限取消,防火墙装上,关闭所有没必要的端口,外层加装路由器映射, 修改常用端口,将常用端口改成陷阱程序,只要访问我这些陷阱端口,程序直接dr ...

  8. 这两周服务器被攻击,封锁了600多个IP地址段后今天服务器安静多了

    这两周服务器被攻击,封锁了600多个IP地址段后今天服务器安静多了 建议大家在自己的服务器上也封杀这些瘪三的地址 iptables -I INPUT -s 123.44.55.0/24 -j DROP ...

  9. ArcGIS Desktop 10.1+ArcEngine10.1完全破解安装教程(含下载地址+亲测可用!)

    最近在二次开发中用到了VS2010+ArcGIS的二次开发模式,因为之前的某些原因,对ArcGIS的接触甚少.初次安装也遇到了很多问题,这里做一个总结. 系统环境 win732位操作系统 需要文件 ( ...

  10. cidr地址段

    CIDR采用各种长度的"网络前缀"来代替分类地址中的网络号和子网号,其格式为:IP地址 = {<网络前缀>,<主机号>}.为了区分网络前缀,通常采用&quo ...

随机推荐

  1. shell专题(五):运算符

    1.基本语法 (1)“$((运算式))”或“$[运算式]” (2)expr  + , - , \*,  /,  %    加,减,乘,除,取余 注意:expr运算符间要有空格 2.案例实操: (1)计 ...

  2. 数据可视化之powerBI基础(七)一文带你熟悉PowerBI建模视图中的功能

    https://zhuanlan.zhihu.com/p/67316729 PowerBI 3月的更新,正式发布了建模视图,而之前只是预览功能.新的建模视图到底有什么用,下面带你认识一下它的主要功能. ...

  3. 前端05 /js基础

    前端05 /js基础 昨日内容回顾 css选择器的优先级 行内(1000) > id(100) > 类(10) > 标签(1) > 继承(0) 颜色 rgb(255,255,2 ...

  4. Alink漫谈(十一) :线性回归 之 L-BFGS优化

    Alink漫谈(十一) :线性回归 之 L-BFGS优化 目录 Alink漫谈(十一) :线性回归 之 L-BFGS优化 0x00 摘要 0x01 回顾 1.1 优化基本思路 1.2 各类优化方法 0 ...

  5. git只操作某个文件夹

    在我们的工作中,可能会有这样的情况发生:我只想提交某一个文件夹,而另外的文件夹我并不想提交. 遇到上述情况,我们再git中这样解决: 1.查看某个文件夹的状态(这里我用log文件夹做实验). 我们可以 ...

  6. Java多线程详解总结

    一.基本概念 程序(program): 是为完成特定任务.用某种语言编写的一组指令的集合.即指一 段静态的代码,静态对象. 进程(process):是程序的一次执行过程,或是正在运行的一个程序.是一个 ...

  7. 洛谷P2365/5785 任务安排 题解 斜率优化DP

    任务安排1(小数据):https://www.luogu.com.cn/problem/P2365 任务安排2(大数据):https://www.luogu.com.cn/problem/P5785 ...

  8. p72_电子邮件

    一.电子邮件格式 信封 abcd@xx.com 内容 2.1 首部(To, Subject)-> (From,To,Subject,Date) 2.2 主体 二.电子邮件组成结构 三.SMTP ...

  9. 题解 洛谷 P6378 【[PA2010]Riddle】

    首先不难看出对于本题的点与点之间的限制关系,我们可以考虑用\(2-SAT\)来解决,通过从状态\(x\)向状态\(y\)连一条有向边表示若状态\(x\)存在,那么状态\(y\)必须存在. 接下来的处理 ...

  10. 16 . Go之网络编程

    互联网的本质 两台计算机之间的通信与两个人打电话原理是一样的. # 1. 首先要通过各种物理连接介质连接 # 2. 找准确对方计算机(准确到软件)的位置 # 3. 通过统一的标准(一般子协议)进行数据 ...