支持以下格式的ip地址:

192.168.1.0/24

192.168.1.1-23

192.168.1.123

代码如下:

package finder;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;

public class Util {

@SuppressWarnings("restriction")
public static ArrayList<String> stringToIps(String str) throws UnknownHostException {  //此方式主要是将各种格式的ip地址,转成ip列表,并以ArrayList<String>格式返回。

ArrayList<String> ips = new ArrayList<String>();  // 保存转换后的ip地址
String strIps[] = str.split("\n");

for (String string : strIps) {
if (sun.net.util.IPAddressUtil.isIPv4LiteralAddress(string)) {  // 校验是否为ip地址
ips.add(string);
} else if (string.lastIndexOf("-") != -1) {  // 判断是否为192.168.1.1-23这种格式
String iph[] = string.split("-");
if (sun.net.util.IPAddressUtil.isIPv4LiteralAddress(iph[0])) {
String x = iph[0];
String ipx[] = x.split("\\.");
Integer start = Integer.parseInt(ipx[3]);
Integer end = Integer.parseInt(iph[1]);

while (start <= end) {
String ip = ipx[0] + "." + ipx[1] + "." + ipx[2] + "." + start.toString();
ips.add(ip);
start++;
}
}

} else if (str.lastIndexOf("/") != -1) {   // 判断是否为192.168.1.1/24这种格式
String iph[] = string.split("/");
if (sun.net.util.IPAddressUtil.isIPv4LiteralAddress(iph[0])) {
Integer mask = Integer.parseInt(iph[1]);
if (mask <= 32 && mask >= 1) {
ips.addAll(maskToIps(iph[0], mask));  // 将网络地址和掩码位数传给maskToIps函数 
}

}
} else {
ips.add(string);

}

}
return ips;

}

public static ArrayList<String> maskToIps(String ip, Integer m) throws UnknownHostException {   // 通过网络地址和掩码位数获取ip地址列表

ArrayList<String> i = new ArrayList<String>();

InetAddress inetAddress = InetAddress.getByName(ip);
int address = inetAddress.hashCode();
Integer n = 32 - m;
int startIp = (address & ((0xFFFFFFFF) << n)); // 最小ip地址
int endIp = (address | ((0xFFFFFFFF) >>> m)); //最大ip地址

while (startIp <= endIp) {

byte[] startaddr = getAddress(startIp);
InetAddress from = InetAddress.getByAddress(startaddr);
String fromIp = from.getHostAddress();
i.add(fromIp);
startIp++;
}

return i;
}

public static byte[] getAddress(int intIp) {  // 将整数ip地址转换成字节数组
int address = intIp;
byte[] addr = new byte[4];

addr[0] = (byte) ((address >>> 24) & 0xFF);
addr[1] = (byte) ((address >>> 16) & 0xFF);
addr[2] = (byte) ((address >>> 8) & 0xFF);
addr[3] = (byte) (address & 0xFF);
return addr;
}

public static ArrayList<Integer> stringToPorts(String str) {  // 这里是将各种格式的端口信息转成端口列表,比如 1-65535,80,8080,8000-9000
String ports[] = str.split(",");
ArrayList<Integer> portList = new ArrayList<Integer>();
for (String string : ports) {
if (string.lastIndexOf("-") != -1) {
String strPorts[] = string.split("-");
Integer startPort = Integer.parseInt(strPorts[0]);
Integer endPort = Integer.parseInt(strPorts[1]);
while (startPort <= endPort) {

if (startPort < 0 || startPort > 0xFFFF) {
portList.add(startPort);
startPort++;

}
}
} else {

Integer in = Integer.parseInt(string);
if (in > 0 && in < 0xFFFF) {
portList.add(in);

}

}

}
return portList;

}

}

不同格式的ip 统一转成ip列表的更多相关文章

  1. 无视编码都统一转成unicode 然后截断 例如 。“发发发发发发” 操作之后显示为 “发发发发...”

    -- local function checkPlayName( str ) -- str = Utils.utf8_to_unicode(str)-- local retStr = "&q ...

  2. [转]为何TCP/IP协议栈设计成沙漏型的

    http://m.blog.csdn.net/blog/dog250/18959371 前几天有人回复我的一篇文章问,为何TCP/IP协议栈设计成沙漏型的.这个问题问得好!我先不谈为何它如此设计,我一 ...

  3. IP地址转换成Long型数字的算法

    在应用程序开发中,涉及到IP地址的存储,大部分开发人员都将其存为String(或文本类型).能否将固定格式为m.n.x.y的IP地址转换成 Long型的数字呢?答案是肯定的.在数据库层面,可以直接将结 ...

  4. Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer 关于Newtonsoft.Json,LINQ to JSON的一个小demo mysql循环插入数据、生成随机数及CONCAT函数 .NET记录-获取外网IP以及判断该IP是属于网通还是电信 Guid的生成和数据修整(去除空格和小写字符)

    Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer   Advanced Installer :Free for 30 da ...

  5. 如何将自己写的verilog模块封装成IP核

    如何将自己写的verilog模块封装成IP核 (2014-11-21 14:53:29) 转载▼ 标签: 财经 分类: 我的东东 =======================第一篇========= ...

  6. [转]字符型IP地址转换成数字IP的SQL函数

    使用SQL函数可以实现许多的功能,下面为您介绍的是字符型IP地址转换成数字IP的SQL函数示例,供您参考,希望对您学习SQL函数能够有所帮助.      /**//*--调用示例       sele ...

  7. linux c/c++ IP字符串转换成可比较大小的数字

    由www.169it.com搜集整理 IP字符串转换成可比较大小的数字,具体代码如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include "stdio. ...

  8. 用 localhost 访问正常,替换成 IP ,部分 CSS 或 JS 就失效了

    这应该是浏览器的兼容性问题. 经测试,只要不是360浏览器的兼容模式,将 localhost 替换成 IP 无影响. 来自为知笔记(Wiz)

  9. PHP中将ip地址转成十进制数的两种实用方法

    As we all know that long2ip works as ip1.ip2.ip3.ip4 (123.131.231.212) long ip => (ip1 * 256 * 25 ...

随机推荐

  1. 在Window系统中使用Redis缓存策略

    Redis是一个用的比较广泛的Key/Value的内存数据库,新浪微博.Github.StackOverflow 等大型应用中都用其作为缓存,Redis的官网为http://redis.io/. 最近 ...

  2. spring揭秘读书笔记----spring的ioc容器之BeanFactory

    spring的ioc容器是一种特殊的Ioc Service Provider(ioc服务提供者),如果把普通的ioc容器认为是工厂模式(其实很相似),那spring的ioc容器只是让这个工厂的功能更强 ...

  3. 递归函数, 匿名函数, yield from

    递归函数 函数执行流程 http://pythontutor.com/visualize.html#mode=edit 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 ...

  4. 使用 %matplotlib inline 出错?

    %matplotlib inline 是一个魔法函数(Magic Functions).官方给出的定义是:IPython有一组预先定义好的所谓的魔法函数(Magic Functions),你可以通过命 ...

  5. vue 结合localStorage 来双向绑定数据

    结合localStorage 来双向绑定数据(超级神奇) localStorage.js: const STORAGE_KEY = 'todos_vuejs' export default { fet ...

  6. css - 紧贴底部的页脚

    有的时候,由于页面长度不够,页面底部的页脚会很尴尬的跑上来,如图: 有的同学可能会想用position:fixed;bottom:0;来永远居底.但有些场景确实不适合. 这是我从YII2中找到的简单解 ...

  7. form表单右边弹窗提示不能为空

    if (key == null || key == "") { layer.tips('流程标识key不能为空', $('#search_input'), { tips: [3, ...

  8. mysql之select into outfile

    参见:http://dev.mysql.com/doc/refman/5.1/en/select-into.html 例子: SELECT a,b,a+b INTO OUTFILE '/tmp/res ...

  9. Java并发编程(十)设计线程安全的类

    待续... 线程安全的类 之前学了很多线程安全的知识,现在导致了我每次用一个类或者做一个操作我就会去想是不是线程安全的.如果每次都这样的考虑的话就很蛋疼了,这里的思路是,将现有的线程安全组件组合为更大 ...

  10. java 服务接口API限流 Rate Limit

    一.场景描述 很多做服务接口的人或多或少的遇到这样的场景,由于业务应用系统的负载能力有限,为了防止非预期的请求对系统压力过大而拖垮业务应用系统. 也就是面对大流量时,如何进行流量控制? 服务接口的流量 ...