java 子网掩码和IP计算起始IP和终止IP工具类

java 子网掩码和IP计算起始IP和终止IP工具类

1.根据掩码位数获取掩码

2.根据ip地址和掩码获取起始IP

3.根据ip地址和掩码获取终止IP

4.ip转换Long

5.实际可用ip数量


public class NetAddressUtils {/*** 根据掩码位数获取掩码*/public static String getNetMask(String mask) {int inetMask =Integer.parseInt(mask);if(inetMask > 32){return null;}//子网掩码为1占了几个字节int num1 = inetMask/8;//子网掩码的补位位数int num2 = inetMask%8;int array[] = new int[4];for (int i = 0; i < num1; i++) {array[i] = 255;}for (int i = num1; i < 4; i++) {array[i] = 0;}for (int i = 0; i < num2; num2--) {array[num1] += Math.pow(2, 8-num2);}return  array[0] + "." + array[1] + "." + array[2] + "." + array[3];}/*** 根据ip地址和掩码获取起始IP* @param ipinfo* @param netMask* @return*/public static String getLowAddr(String ipinfo, String netMask) {String lowAddr = "";int ipArray[] = new int[4];int netMaskArray[] = new int[4];if(4 != ipinfo.split("\\.").length || "" == netMask){return null;}for (int i = 0; i < 4; i++) {try{ipArray[i] = Integer.parseInt(ipinfo.split("\\.")[i]);}catch(NumberFormatException e){String ip = ipinfo.replaceAll("\n", "");ipArray[i] = Integer.parseInt(ip.split("\\.")[i]);}netMaskArray[i] = Integer.parseInt(netMask.split("\\.")[i]);if(ipArray[i] > 255 || ipArray[i] < 0 || netMaskArray[i] > 255 || netMaskArray[i] < 0){return null;}ipArray[i] = ipArray[i]&netMaskArray[i];}//构造最小地址for (int i = 0; i < 4; i++){if(i == 3){ipArray[i] = ipArray[i] + 1;}if ("" == lowAddr){lowAddr +=ipArray[i];} else{lowAddr += "." + ipArray[i];}}return lowAddr;}/*** 根据ip地址和掩码获取终止IP* @param ipinfo* @param netMask* @return*/public static String getHighAddr(String ipinfo, String netMask) {String lowAddr = getLowAddr(ipinfo, netMask);int hostNumber = getHostNumber(netMask);if("" == lowAddr || hostNumber == 0){return null;}int lowAddrArray[] = new int[4];for (int i = 0; i < 4; i++) {lowAddrArray[i] = Integer.parseInt(lowAddr.split("\\.")[i]);if(i == 3){lowAddrArray[i] = lowAddrArray[i] - 1;}}lowAddrArray[3] = lowAddrArray[3] + (hostNumber - 1);if(lowAddrArray[3] >255){int k = lowAddrArray[3] / 256;lowAddrArray[3] = lowAddrArray[3] % 256;lowAddrArray[2] = lowAddrArray[2] + k;}if(lowAddrArray[2] > 255){int  j = lowAddrArray[2] / 256;lowAddrArray[2] = lowAddrArray[2] % 256;lowAddrArray[1] = lowAddrArray[1] + j;if(lowAddrArray[1] > 255){int  k = lowAddrArray[1] / 256;lowAddrArray[1] = lowAddrArray[1] % 256;lowAddrArray[0] = lowAddrArray[0] + k;}}String highAddr = "";for(int i = 0; i < 4; i++){if(i == 3){lowAddrArray[i] = lowAddrArray[i] - 1;}if("" == highAddr){highAddr = lowAddrArray[i]+"";}else{highAddr += "." + lowAddrArray[i];}}return highAddr;}/*** ip转换Long* @param ip* @return*/public static long ip2long(String ip) {String[] ips = ip.split("[.]");if (ips.length != 4 || "".equals(ip)) {return 0;} else {return 16777216L * Long.parseLong(ips[0]) + 65536L* Long.parseLong(ips[1]) + 256 * Long.parseLong(ips[2])+ Long.parseLong(ips[3]);}}/*** 实际可用ip数量* @param netMask* @return*/public static int getHostNumber(String netMask) {int hostNumber = 0;int netMaskArray[] = new int[4];for (int i = 0; i < 4 ; i++) {netMaskArray[i] = Integer.parseInt(netMask.split("\\.")[i]);if(netMaskArray[i] < 255){hostNumber =  (int) (Math.pow(256,3-i) * (256 - netMaskArray[i]));break;}}return hostNumber;}public static int getNetMaskNumber(String netMask) {int netMaskNumber = 0;switch (netMask) {case "255.255.255.255":netMaskNumber = 32;break;case "255.255.255.254":netMaskNumber = 31;break;case "255.255.255.252":netMaskNumber = 30;break;case "255.255.255.248":netMaskNumber = 29;break;case "255.255.255.240":netMaskNumber = 28;break;case "255.255.255.224":netMaskNumber = 27;break;case "255.255.255.192":netMaskNumber = 26;break;case "255.255.255.128":netMaskNumber = 25;break;case "255.255.255.0":netMaskNumber = 24;break;case "255.255.254.0":netMaskNumber = 23;break;case "255.255.252.0":netMaskNumber = 22;break;case "255.255.248.0":netMaskNumber = 21;break;case "255.255.240.0":netMaskNumber = 20;break;}return netMaskNumber;}//    public static void main(String[] args) throws Exception {
//        /*
//         * 10.197.12.0	255.255.254.0	 10.197.12.1 	10.197.13.254	Used	210
//         * 10.202.123.0	255.255.255.0	10.202.123.1	10.202.123.254	Used	11
//         * 10.194.220.0	255.255.255.224	10.194.220.1	10.194.220.254	Used	22
//         * 10.102.161.0	255.255.255.0	10.102.161.1	10.102.161.254	Used	12
//         */
//        String ip = "10.194.220.0";
//        String netmask = "255.255.255.224";
        String startIp = NetAddressUtils.getLowAddr(ip, netmask);
        String endIp = NetAddressUtils.getHighAddr(ip, netmask);
        System.out.println("start ip: " + startIp);
        System.out.println("end ip: " + endIp);
        System.out.println("amount: " +
                (NetAddressUtils.ip2long(endIp) - NetAddressUtils.ip2long(startIp) + 1));
//
//        int ss = getHostNumber(netmask);
//        System.out.println(ss);
//        String aa  = getNetMask("28");
//        System.out.println(aa);
//    }}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/24408.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

写一个经典的java引用传递的例子

private fun getRaidType(): List<SelectItem<String>> {var list raidTyperaidType.forEach{Log.i("DHG","raidType is $it")}list.forEach{Log.i("DHG","list raidType is $it")}viewModel.diskInfo?.value?.forEach…

SOLIDWORKS参数化设计插件 慧德敏学

SOLIDWORKS软件是法国达索公司的产品&#xff0c;最初是满足欧美一些工程师产品设计需要而开发的&#xff0c;并没有考虑中国的企业实际情况。我们为满足国内客户的需要&#xff0c;对SOLIDWORKS进行了二次开发&#xff0c;借助SolidKits.AutoWorks参数化工具&#xff0c;通过一…

.Net Core 8.0 IIS部署遇到奇怪的部分接口报404的问题解决

本地运行没问题&#xff0c;部署到IIS后&#xff0c;部分接口报404&#xff0c;其它接口都正常。 经和群里讨论&#xff0c;大概意思是接口返回数据比较大的时候&#xff0c;就会出现这个问题。 查看事件查看器&#xff0c;发现应该是数据过大时使用了临时文件夹&#xff0c;…

2024高考作文引发的人工智能争议

又是一年高考季&#xff0c;多少学子的修行成果也在这这一刻迎来了终极检验&#xff0c;多少学子的梦也在这一刻拉开了揭晓序幕&#xff0c;多少学习的命运也在这一刻迎来了人生中的第一次转变。每年的高考不仅是学子们的人生大事&#xff0c;也是多少父母的热切期望&#xff0…

VSCode函数无法跳转问题,小插件安装说明

1、问题&#xff1a; VSCode中程序想查看某函数内部&#xff0c;无法跳转。 2、解决办法&#xff1a; 安装C/C GNU Global插件即可解决 3、安装操作步骤&#xff1a; 1&#xff09;方式1&#xff1a; 可在VSCode中左侧栏中&#xff08;图中1&#xff09;&#xff0c;搜索…

Ubuntu22.04之解决:无法关机和重启问题(二百四十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

LeetCode ---400周赛

题目列表 3168. 候诊室中的最少椅子数 3169. 无需开会的工作日 3170. 删除星号以后字典序最小的字符串 3171. 找到按位与最接近 K 的子数组 一、候诊室中的最少椅子数 简单的模拟题&#xff0c;我们可以这样来模拟&#xff1a;当有顾客来时&#xff0c;我们加一把椅子&…

使用mkfs.jffs2工具制作jffs2镜像

使用mkfs.jffs2工具制作jffs2镜像 -d 指定需要制作的文件夹目录名 -l 使用小端格式 -e 设定擦除块的大小 0x10000 (64K) 0x20000 (128K) 0x40000 (256K) mkfs.jffs2 -d test_jffs2 -l -e 0x10000 -o test_64k_jffs2.jffs2 mkfs.jffs2 -d test_jffs2 -l -e 0x20000 -o te…

关于使用南墙waf防护halo网站主页请求404报错的解决方案

文章目录 环境说明问题展示原因探究解决方法 环境说明 在1panel应用商店&#xff0c;部署南墙waf(docker版)halo(2.16.1社区版)注意部署过程中注意uuwaf必须勾选允许外部访问&#xff0c;halo可以不勾选[这里为了证明确实是南墙waf的原因&#xff0c;选择勾选] 问题展示 使…

泛微开发修炼之旅--09Ecology作为所有异构系统的待办中心,实现与kafka对接源码及示例

文章链接&#xff1a;泛微开发修炼之旅--09Ecology作为所有异构系统的待办中心&#xff0c;实现与kafka对接源码及示例

【力扣第 400 场周赛】Leetcode 删除星号以后字典序最小的字符串

文章目录 1. 删除星号以后字典序最小的字符串 1. 删除星号以后字典序最小的字符串 题目链接 &#x1f34e; 解题思路&#xff1a;遇到 *就删除一个字符&#xff0c;为了满足题意&#xff0c;要删除字典序最小的字符&#xff0c;那么假如有多个字典序最小的字符我们该删除哪个…

自用的2个chatpgt plus拼车渠道!!!

两个渠道&#xff0c;银河和环球&#xff0c;各有优劣 由于平台限制&#xff0c;链接和优惠码&#xff0c;可看原文 原文&#xff1a;https://www.aiutools.fun/archives/4978 先说结论 gpt重度用户&#xff1a;一天50次以上&#xff0c;选 环球 gpt轻度用户&#xff1a;一天用…

无码高清?Stable DIffusion教程 | 如何利用 Stable Diffusion webui 将图片变得更清晰?全方位对比4种放大方法!

大家好&#xff0c;我是大师兄 1、引言 “高分放大”&#xff08;有时候也叫“超分放大”或“高清修复”&#xff09;描述了在确保图像清晰度的前提下提升图片分辨率的过程。例如&#xff0c;将一张512 x 512的图片放大四倍&#xff0c;得到的就是2048 x 2048分辨率的图片&am…

暂停系统更新

电脑左下角搜索注册表编辑器 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings 找到这个目录 打开FlightSettingsMaxPauseDays&#xff0c;没找到的话就创建一个同名文件夹然后选择10进制填入3550​​​​​​​ 最后进入系统暂停更新界面选择最下面…

英伟达Blackwell芯片正式投入生产 | 百能云芯

在近日的一场公开活动中&#xff0c;英伟达公司的创始人和首席执行官黄仁勋正式宣布&#xff0c;备受瞩目的Blackwell芯片已成功投产。 黄仁勋在讲话中强调&#xff0c;英伟达将继续坚持其数据中心规模、一年节奏、技术限制、一个架构的战略方向。这意味着英伟达将继续运用业界…

1000Base-T协议解读

一、说明 千兆以太网家族包括1000Base-SX(短距)、1000Base-LX(长距)、1000Base-CX(铜缆短距)、1000Base-T1(车载以太网)和1000Base-T等多种标准,我们这边主要了解下1000Base-T,也就是工业千兆以太网,PC电脑的网口都是这个。 1000Base-T采用了4D-PAM5编码技术(4D代…

Java Web学习笔记4——HTML、CSS

HTML&#xff1a; HTML&#xff1a;超文本标记语言。 超文本&#xff1a;超越了文本的限制&#xff0c;比普通文本更强大。除了文字信息&#xff0c;还可以定义图片、音频、视频等内容。 标记语言&#xff1a;有标签构成的语言。 HTML标签都是预定义好的&#xff0c;例如&a…

C++中的字符串详解

在C中&#xff0c;字符串处理可以通过多种方式实现&#xff0c;主要包括C风格字符串&#xff08;C-style strings&#xff09;和C标准库提供的std::string类。下面对这两种字符串进行详细解释。 C风格字符串 C风格字符串是以null字符&#xff08;\0&#xff09;结尾的字符数组…

css网格背景样式

空白内容效果图 在百度页面测试效果 ER图效果 注意&#xff1a;要给div一个宽高 <template><div class"grid-bg"></div> </template><style scoped> .grid-bg {width: 100%;height: 100%;background: url(data:image/svgxml;base…

MySQL数据库数据恢复方案应对没有where误操作导致的大量数据更新或删除

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…