统计两个IP地址之间的IP个数

栏目: 服务器 · 发布时间: 6年前

内容简介:求两个IP地址之间的IP个数,例如192.18.16.1~192.18.16.5,2001:DB8:0000:0023:0008:0800:200C:417C~2001:DB8:0:23:8:800:200C:417D之间的IP个数?`import java.math.BigInteger;

问题

求两个IP地址之间的IP个数,例如192.18.16.1~192.18.16.5,2001:DB8:0000:0023:0008:0800:200C:417C~2001:DB8:0:23:8:800:200C:417D之间的IP个数?

算法

`

import java.math.BigInteger;

import java.util.ArrayList;

import java.util.List;

public class IPCount {

public long ipv4ToNumber(String ip) {
    long rs = 0;
    if (ip == null || ip.isEmpty()) {
        return rs;
    }
    String[] ips = ip.split("\\.");
    for (int i = 0; i < ips.length; i++) {
        rs += Integer.parseInt(ips[i]) * Math.pow(256, (3 - i));
    }
    return rs;
}

/**
 * 数字转换成IPv4地址
 * @param number
 * @return
 */
public String numberToIpv4(long number) {
    String ip = "";
    List<String> ips = new ArrayList<String>();
    for (int i = 0; i < 8; i++) {
        ips.add(String.valueOf(number % 256));
        number = number >> 8;
    }
    for (int i = ips.size() - 1; i >= 0; i--) {
        ip = ip.concat(ips.get(i));
        if (i > 0) {
            ip = ip.concat(".");
        }
    }
    return ip;
}

/**
 * IPv6地址转换成数字
 * @param ip
 * @return
 */
public BigInteger ipv6ToNumber(String ip) {
    String[] ips = ip.split(":");
    BigInteger rs = new BigInteger("0");
    
    for (int i = 0; i < ips.length; i++) {
        BigInteger a = BigInteger.valueOf(Integer.parseInt(ips[i], 16));
        BigInteger b = BigInteger.valueOf(65536).pow(7 - i);
        BigInteger c = a.multiply(b);
        rs = rs.add(c);
    }
    return rs;
}

/**
 * 数字转换成IPV6地址
 * @param number
 * @return
 */
public String numberToIpv6(BigInteger number) {
    String ip = "";
    List<String> ips = new ArrayList<String>();
    
    for (int i = 0; i < 8; i++) {
        ips.add(Integer.toHexString(number.divideAndRemainder(BigInteger.valueOf(65536))[1].intValue()));
        number = number.shiftRight(16);
    }
    
    for (int i = ips.size() - 1; i >= 0; i--) {
        ip = ip.concat(ips.get(i));
        if (i > 0) {
            ip = ip.concat(":");
        }
    }
    return ip;
}

/**
 * 查找两个IP地址之间的IP
 * @param startIp
 * @param endIp
 * @return
 */
public List<String> findIPs(String startIp, String endIp) {
    BigInteger startNumber = this.ipv6ToNumber(startIp);
    BigInteger endNumber = this.ipv6ToNumber(endIp).add(BigInteger.valueOf(1));
    List<String> ips = new ArrayList<String>();
    while (startNumber.compareTo(endNumber) < 0) {
        ips.add(this.numberToIpv6(startNumber));
        startNumber = startNumber.add(BigInteger.valueOf(1));
    }
    return ips;
}

}

`

原理

无论是IPV4还是IPV6,它们其实都是对应整数值,但是为了方面人的理解和分析,对这个整数采用了某种格式化的方式进行表示,比如IPV4是一个32的整数,采用点分十进制的格式表示,IPV6是一个128位的整数,采用冒分十六进制的个数表示, 也就是说对于一个给定的32位整数,可以转换成一个IP地址,同样,对于一个给定的IP地址,可以转换成一个32位的整数,所以计算两个IP地址之间的个数或者IP,其实就是计算两个整数之间有多少个整数

只是IPV6对应一个128位的整数,所以使用 Java 基本的数据类型long是无法存储这么多位的数据的,需要采用了BigInteger


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Implementing Responsive Design

Implementing Responsive Design

Tim Kadlec / New Riders / 2012-7-31 / GBP 27.99

New devices and platforms emerge daily. Browsers iterate at a remarkable pace. Faced with this volatile landscape we can either struggle for control or we can embrace the inherent flexibility of the w......一起来看看 《Implementing Responsive Design》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具