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. 05 drf源码剖析之认证

    05 drf源码剖析之认证 目录 05 drf源码剖析之认证 1. 认证简述 2. 认证的使用 3. 源码剖析 4. 总结 1. 认证简述 当我们通过Web浏览器与API进行交互时,我们可以登录,然后 ...

  2. python 生成器(一):生成器基础(一)生成器函数

    前言 实现相同功能,但却符合 Python 习惯的方式是,用生成器函数代替SentenceIterator 类.示例 14-5 sentence_gen.py:使用生成器函数实现 Sentence 类 ...

  3. How to install chinese input method

    在Ubuntu中安装中文输入法确实比较麻烦,特别是英文版的Ubuntu系统   Ubuntu上的输入法主要有小小输入平台(支持拼音/二笔/五笔等),Fcitx,Ibus,Scim等.其中Scim和Ib ...

  4. Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解

    随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决这一问题非常好的手段之一.Spring 3开始提供了强大的基于注解的缓 ...

  5. 第三章:View的事件体系

    3.1 View的基础知识 主要有:View的位置参数,MotionEvent和TouchSlop对象,VelocityTracker,GestureDetector和Scroller对象 3.1.1 ...

  6. vue : 本地调试跨域问题的解决办法:proxyTable

    本来我是不想写的,但为了加深印象还是写一写吧. ./config/index.js module.exports = { dev: { // Paths assetsSubDirectory: 'st ...

  7. python如何编写win程序

    python可以编写win程序.win程序的格式是exe,下面我们就来看一下使用python编写exe程序的方法. 编写好python程序后py2exe模块即可将其打包为exe程序. 实际操作过程: ...

  8. 图片懒加载、ajax异步调用数据、lazyload插件的使用

    关于这个效果还是很简单的,样式部分我就不多说了,我就简单的写了一下布局, 这是css样式 我们先说一下实现的原理. 我们都知道在于图片的引入,我们都是用src来引入图片地址.从而实现图片的显示.那我们 ...

  9. stm32-HAL库串口收发

    串口发送 重写fputc函数 /* 优点 直接使用printf函数,发送数据长度无限制,不需要额外的数组空间 缺点 只能对应一个串口,暂时没想到解决方案 */ //头文件中要包含 stdio.h 然后 ...

  10. 面试题三十:包含min函数的栈

    定义一个栈的数据结构,请实现一个每次都能找到栈中的最小元素,要求时间复杂度O(1).意思就是说每次进栈出栈后,min函数总能在时间1的前提下找到.方法一:由于每次循序遍历栈的话时间复杂度为n,所以要想 ...