问题

求两个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 {/*** IPv4地址转换成数字* @param ip*/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

统计两个IP地址之间的IP个数相关推荐

  1. 网址,域名,IP地址之间的关系是什么?

    什么是ip? 我们知道,在Internet上有千百万台主机,为了区分这些主机,人们给每台主机都分配了一个专门的地址,称为IP地址.通过IP地址就可以访问到每一台主机. IP地址由4部分数字组成,每部分 ...

  2. 服务器网站域名ip地址的关系,IP地址与域名两者之间的关系

    一. 什么是IP地址? 每个连接在Internet上的主机分配的一个32bit地址.按照TCP/IP协议规定,IP地址及用二进制来表示,每个IP地址长32bit,比特换算成字节,就是4个字节. 上面的 ...

  3. IP地址和二进制IP地址之间的转换

    我们看到的IP通常是类似于127.0.0.1这样的字符串,然而计算机理解的则是像0x01111111100000000000000000000001(127.0.0.1)这样的ip地址方式. 对于Li ...

  4. 关于公共IP地址(公网ip):您需要知道的一切

    目录: 什么是公共ip地址? 私有IP与公共IP地址 公共IP地址范围 如何查找您的公共IP地址 动态ip 隐藏您的公共IP地址 什么是公共ip地址? 公共IP地址是您的家庭或企业路由器从ISP接收的 ...

  5. 公有ip地址和私有ip地址_如何查找您的私有和公共IP地址

    公有ip地址和私有ip地址 Each device on your network has a private IP address only seen by other devices on the ...

  6. linux下dhcp服务器分配出去的IP地址及剩余IP地址

    我认为有2种办法 1.你可以查看防火墙信息,如图,可以清晰的看到,192.1681.200的IP给了哪个MAC地址 2. /var/lib/dhcpd/dhcpd.leases  这个文件专门记录了D ...

  7. 查看linux下dhcp服务器分配出去的IP地址及剩余IP地址

    1.你可以查看防火墙信息,如图,可以清晰的看到,192.1681.200的IP给了哪个MAC地址 2. /var/lib/dhcpd/dhcpd.leases 这个文件专门记录了DHCP的分配情况 一 ...

  8. 2023-5-7 什么是公网、内网、局域网、广域网、互联网?已经有了mac地址为什么还需要ip地址?使用ip地址是如何进行构建互联网的?

    2023-5-7 什么是公网.内网.局域网.广域网.互联网?已经有了mac地址为什么还需要ip地址?使用ip地址是如何进行构建互联网的?什么是内网穿透? 文章目录 2023-5-7 什么是公网.内网. ...

  9. 计算机网络私有地址吗,公有IP地址与私有IP地址有什么不同?

    您有两个IP地址是什么意思?我们使用电脑上网,通常会用到2个IP地址,就是我们常说的WAN口公共IP和LAN口私有IP地址. 有一天,当您四处浏览计算机的网络偏好设置或连接一台新路由器时,您可能会突然 ...

最新文章

  1. PyTorch与TensorFlow特性对比
  2. puppeteer php,puppeteer 页面爬取实例(元素遍历)
  3. linux下删除乱码文件、目录
  4. grub引导iso光盘[可用于ntfs]
  5. matlab trendsurface,MATLAB 添加新的预测性维护产品
  6. java+arrayblockquene_Java源码分析-ArrayBlockingQueue
  7. ListView列表刷新方法的区别
  8. Android杂谈--ListView之SimpleAdapter的使用
  9. mysql 年龄计算(根据生日字段)
  10. 推荐几个代码自动生成器,神器!!!
  11. rdcman汉化_Remote Desktop Organizer – 管理组织远程桌面 - 小众软件
  12. java联机对战五子棋游戏(SWT版)
  13. 高通平台 LCD 的 LK部分代码解析
  14. Intel CPU(i3、i5、i7、i9)型号、性能详细解读
  15. 微信授权 昵称显示微信用户、无头像
  16. 股票涨跌的心理学原理: 遗憾理论
  17. 安卓逆向-new-sec6-5 平头哥框架hook简介 | 类加载器 | 内部类
  18. 技巧:屏幕長亮 兩種方式
  19. 【中亦安图】关于数据库文件损坏风险的提醒(3)
  20. 【软件测试】自动化测试战零基础教程——Python自动化从入门到实战(一)

热门文章

  1. FCN-Fully Convolutional Networks
  2. 华为2018春招笔试题目 字节流解析与长整数相乘
  3. bind-html自动换行,如何实现textarea placeholder自动换行?
  4. 外链引入css有哪些方式_外链怎么发才会快速收录?
  5. Spring配置中的classpath:与classpath*:的区别研究
  6. Vulnhub靶场渗透练习(二) Billu_b0x
  7. 51单片机学习笔记(清翔版)(13)——LED点阵、74HC595
  8. node模块加载机制。
  9. HTML中添加meta http-equiv=X-UA-Compatible content=IE=edge,chrome=1
  10. 所谓的日常 #6 - 焚金闕董卓行兇 匿玉璽孫堅背約