private static final int IPV4BYTES = 4; // IPv4字节数为4
private static final int BYTEBITS = 8; // 每个字节的比特位长度为8/* IPv4,计算一个地址范围所属最小"网络地址/子网掩码"例:1.1.0.1-1.1.3.10或者1.1.3.10-1.1.0.11.1.0.1: 00000001 00000001 00000001 000000011.1.3.10:00000001 00000001 00000011 00001010从左至右找到第一个不同所在位置,得到子网掩码为22将子网掩码后面的位数置为0,得到网络地址1.1.0.0返回1.1.0.0/22*/
public static String getNetworkAddressAndNumMask(String startAddress, String endAddress) {String networkAddress = "";int mask = 0;// 用.分隔起始地址和结束地址,并将String型数组转为int型数组String[] startStrArr = startAddress.split("\\.");int[] startNums = Arrays.asList(startStrArr).stream().mapToInt(Integer::parseInt).toArray();String[] endStrArr = endAddress.split("\\.");int[] endNums = Arrays.asList(endStrArr).stream().mapToInt(Integer::parseInt).toArray();// 计算子网掩码for (int i = 0; i < IPV4BYTES; i++) {int xorValue = startNums[i] ^ endNums[i]; // 异或操作if (xorValue > 0) {for (int j = 1; j <= BYTEBITS; j++) {if ((xorValue >>> j) == 0) { // 右移直至为0mask += (BYTEBITS - j); // 8减右移位数为网络位break;}}break;} else { // 如果异或值为0,则目前的8位为网络位mask += BYTEBITS;}}// 计算网络地址int[] networkNums = new int[IPV4BYTES];for (int i = 0; i < IPV4BYTES; i++) {if (mask / BYTEBITS > i) {networkNums[i] = startNums[i];} else if (mask / BYTEBITS == i) {networkNums[i] = startNums[i] & (255 << (BYTEBITS - mask % BYTEBITS));} else {networkNums[i] = 0;}}networkAddress = StringUtils.join(networkNums, ".");return networkAddress + "/" + mask;
}/* IPv4,计算一个地址范围所属最小"网络地址 点分十进制掩码"例:1.1.0.1-1.1.3.10返回1.1.0.0 255.255.252.0*/
public static String getNetworkAddressAndDottedDecimalMask(String startAddress, String endAddress) {String networkMask = getNetworkAddressAndNumMask(startAddress, endAddress);String networkAddress = networkMask.split("/")[0]; // 网络地址int numMask = Integer.parseInt(networkMask.split("/")[1]); // 子网掩码,数字String dottedDecimalMask = numMaskToDottedDecimalMask(numMask); // 子网掩码,点分十进制return networkAddress + " " + dottedDecimalMask;
}// IPv4,将子网掩码数字转为点分十进制
public static String numMaskToDottedDecimalMask(int numMask) {int[] networkNums = new int[IPV4BYTES];for (int i = 0; i < IPV4BYTES; i++) {if (numMask / BYTEBITS > i) {networkNums[i] = 255;} else if (numMask / BYTEBITS == i) {networkNums[i] = (255 << (BYTEBITS - numMask % BYTEBITS)) & 255;} else {networkNums[i] = 0;}}return StringUtils.join(networkNums, ".");
}// IPv4,将子网掩码点分十进制转为数字
public static int dottedDecimalMaskToNumMask(String dottedDecimalMask) {int numMask = 0;String[] maskStr = dottedDecimalMask.split("\\.");int[] maskInt = Arrays.asList(maskStr).stream().mapToInt(Integer::parseInt).toArray();for (int i = 0; i < IPV4BYTES && maskInt[i] > 0; i++) {for (int j = 1; j <= BYTEBITS; j++) {if ((maskInt[i] << j & 255) == 0) { // 左移,直至遇到0numMask += j;break;}}}return numMask;
}

/* IPv6,计算一个地址范围所属最小"网络地址/前缀长度"例:1a::0-1a::ffff将IPv6地址转为全写从左至右找到第一个不同位所在位置,得到前缀长度将前缀长度后面的位数置为0,得到网络地址*/
public static String getIPv6NetworkAddressAndPrefixLength(String startAddress, String endAddress) {String networkAddress = "";int prefixLen = 0;// 将起始结束地址转为IPv6全写格式// parseFullIPv6函数https://blog.csdn.net/yaocong1993/article/details/108727948startAddress = parseFullIPv6(startAddress);endAddress = parseFullIPv6(endAddress);// 用:分隔起始地址和结束地址,并将16进制String型数组转为10进制int型数组String[] startStrArr = startAddress.split(":");int[] startNums = new int[8];for (int i = 0; i < startStrArr.length; i++) {startNums[i] = Integer.parseInt(startStrArr[i], 16);}String[] endStrArr = endAddress.split(":");int[] endNums = new int[8];for (int i = 0; i < endStrArr.length; i++) {endNums[i] = Integer.parseInt(endStrArr[i], 16);}// 计算前缀长度for (int i = 0; i < 8; i++) {int xorValue = startNums[i] ^ endNums[i]; // 异或操作if (xorValue > 0) {for (int j = 1; j <= 16; j++) {if ((xorValue >>> j) == 0) { // 右移直至为0prefixLen += (16 - j); // 16减右移位数为网络位break;}}break;} else { // 如果异或值为0,则目前的16位为网络位prefixLen += 16;}}// 计算网络地址String[] networkStrArr = new String[8];for (int i = 0; i < 8; i++) {if (prefixLen / 16 > i) {networkStrArr[i] = startStrArr[i];} else if (prefixLen / 16 == i) {networkStrArr[i] = Integer.toHexString(startNums[i] & (65535 << (16 - prefixLen % 16)));} else {networkStrArr[i] = "0";}}networkAddress = StringUtils.join(networkStrArr, ":");return networkAddress + "/" + prefixLen;
}

IPv4/IPv6地址范围与网络地址/子网掩码的转换,点分十进制与数字掩码的转换相关推荐

  1. 网络编程 网络地址点分十进制和二进制之间的转换

    网络编程 网络地址点分十进制和二进制之间的转换 点分十进制->二进制 点分十进制转二进制的函数有inet_addr,inet_aton,inet_network,inet_pton,它们都将输入 ...

  2. windows下使用cmd命令设置静态IPv4 IPv6地址

    cmd命令设置静态IPv4地址 netsh interface ip set address 网卡名称 static 静态IP 子网掩码 默认网关 1 例如: netsh interface ip s ...

  3. 组播MAC/IPv4/IPv6地址

    IPV4组播地址 分类 地址范围 含义 永久组播地址 224.0.0.0–224.0.0.255 永久组播地址(为特定协议分配) 224.0.0.1 网段内所有主机和路由器(等效于广播地址) 224. ...

  4. RH358管理DHCP和IP地址分配--配置分配IPv6地址

    RH358管理DHCP和IP地址分配–配置分配IPv6地址 本章节介绍配置DHCP分配IPv6地址,虽然还是有点鸡肋,但可以作为了解和学习用. 专栏地址:https://blog.csdn.net/q ...

  5. java判断ipv6地址类型_IPv6地址类型与格式

    十六进制数字系统 在介绍IPv6的地址格式之前,我们将探讨十六进制数字系统.十六进制是位置的数字系统,它使用16进制(基).来表示可读格式的值,本系统采用0-9符号来表示的值从0到9和AF符号来表示数 ...

  6. IP地址点分十进制与二进制整数之间的转换

    error C4996: 'inet_addr': Use inet_pton() or InetPton() instead or define _WINSOCK_DEPRECATED_NO_WAR ...

  7. IPv4、IPv6地址、组播地址及子网子划分详解三可变长子网掩码

    IPv4.IPv6地址.组播地址及子网子划分详解三可变长子网掩码 5.5.可变长子网掩码(VlSM) 5.5.可变长子网掩码(VlSM) 先看一下分类组网,路由选择协议RIPv1没有包含子网信息的字段 ...

  8. 【计算机网络】网络层 : 总结 ( 功能 | 数据交换 | IP 数据报 | IPv4 地址 | IPv6 地址 | 路由选择协议 | 路由算法 )★★★

    文章目录 一.网络层功能 二.数据交换方式 ★ 三.IP 数据报 ★ 四. IPv4 地址 ★★ 1 . IP 地址 发展 : 2 . 分类 IP 地址 3 . NAT 转换 4 . 子网划分 5 . ...

  9. IPv4、IPv6地址、组播地址及子网子划分详解一

    一.IPv4地址 1.IP地址的定义 IP地址是分配给IP网络中每台机器的数字标识符,它指出了设备在网络中的具体位置.由 32 位二进制数组成.IP地址是软件地址,而不是硬件地址. 在因特网中给每台电 ...

最新文章

  1. 解决selenium报错--unknown error: DevToolsActivePort file doesn‘t exist
  2. linux ln 权限不够,每次执行./都会出现权限不够,已经是root了 已解决!
  3. java中 fff_Java:要实现记录当前时间为yyyymmddhhmissfff的时间戳该怎么简单实现呢=。=...
  4. Spark2.11 两种流操作 + Kafka
  5. 怎么拆计算机主机,技术编辑教您电脑机箱怎么拆
  6. Xcode中指令集相关选项
  7. 计算机设备投标标书范本,OA办公自动化系统投标文件(标书范本)
  8. RTL8201EL介绍
  9. 05章 体检套餐管理系统
  10. python md5加密_如何用python“优雅”的调用有道翻译?
  11. vmVare使用NAT模式-配置详情
  12. 【246天】跃迁之路——程序员高效学习方法论探索系列(实验阶段04-2017.10.09)...
  13. 利用Vitis开发基于ZCU106的神经网络加速器(二)——DPU编译及Demo
  14. Linux常用图片查看处理软件
  15. tsx vue3 自定义指令
  16. mysql如何更新两条数据_mysql根据查询结果批量更新多条数据(插入或更新)
  17. 整理了500万+微信红包封面,速抢!
  18. 织梦cms是什么-织梦CMS免费搭建工具只需要输入域名
  19. oracle左关联+号表示方式
  20. 我做数画ai绘画教程日赚过千,良心分享给想兼职赚钱的人

热门文章

  1. 用户画像(一):我对用户画像的理解
  2. 一个纯技术程序员的求职心酸历程
  3. python脚本编程读后感_Python编程:从入门到实践经典读后感10篇
  4. 关于517编程的11月月赛
  5. 需求:解压获取ipa里面的图片在windows系统上打不开
  6. 台式计算机如何升级,老电脑如何升级 老电脑升级方法【详细介绍】
  7. 三天学会网络爬虫之Day03
  8. java 摄像头 视频_javaCV-摄像头实时视频
  9. 计算机钥匙英语,计算机加锁--把U盘变成打开电脑的钥匙 - 信息科学 - 小木虫 - 学术 科研 互动社区...
  10. 多线程开发实战:Java实现多线程四种方式及相关方法原理