[java]根据ip和掩码计算网段、广播地址及可用ip地址范围

[java]根据ip和掩码计算网段、广播地址及可用ip地址范围ip 地址与掩码 网段 广播地址 可用 ip 范围 IP 网络地址掩码 指明一个 IP 地址的哪些位标识的是主机所在的子网 网段 网络中可通信的部分 一般用子网第一个地址表示 广播地址 专门用于同时向网络中所有工作站进行发送的一个地址 一般用子网最后一个地址表示 可用子网 ip 一般指子网中去除网段 广播地址的地址范围参考资料 子网划分完整代码 importjava util HashMap publicclassI 在 main 方法里

ip地址与掩码、网段、广播地址、可用ip范围

  • IP: 网络地址
  • 掩码: 指明一个IP地址的哪些位标识的是主机所在的子网。
  • 网段:网络中可通信的部分,一般用子网第一个地址表示。
  • 广播地址:专门用于同时向网络中所有工作站进行发送的一个地址;一般用子网最后一个地址表示。
  • 可用子网ip:一般指子网中去除网段、广播地址的地址范围
    参考资料:
    在这里插入图片描述




 import java.util.HashMap; public class IpUtil { 
    / * 在main方法里面可以测试下 * 主要功能都在main方法里,需要什么自己找 */ public static void main(String[] args) { 
    String ip="192.168.1.21";//ip String mask="255.255.254.0";//位数,如果只知道子网掩码不知道位数的话在参考getMaskMap()方法 NetInfo info = new NetInfo(ip,mask); System.out.println("ip:"+info.getIp()); System.out.println("mask:"+info.getMask()); System.out.println("broadcase:"+info.getBroadcast()); System.out.println("segment:"+info.getSegment()); System.out.println("startip:"+info.getStartIp()); System.out.println("endIP:"+info.getEndIp()); System.out.println("count:"+info.getCount()); // System.out.println(getIpFromLong(getNetStartIp(ip,mask))); } / * 输出二进制 * @param n */ public static void binaryToDecimal(long n){ 
    for(int i = 63;i >= 0; i--) { 
    System.out.print(n >>> i & 1); } System.out.println("---->"); } / * 把xx.xx.xx.xx类型的转为long类型的 * * @param ip * @return */ public static Long getIpFromString(String ip) { 
    // 进制 2^8 = 256 共四段 Long ipLong = 0L; String ipTemp = ip; ipLong = ipLong * 256 + Long.parseLong(ipTemp.substring(0, ipTemp.indexOf('.'))); ipTemp = ipTemp.substring(ipTemp.indexOf('.') + 1, ipTemp.length()); ipLong = ipLong * 256 + Long.parseLong(ipTemp.substring(0, ipTemp.indexOf('.'))); ipTemp = ipTemp.substring(ipTemp.indexOf(".") + 1, ipTemp.length()); ipLong = ipLong * 256 + Long.parseLong(ipTemp.substring(0, ipTemp.indexOf('.'))); ipTemp = ipTemp.substring(ipTemp.indexOf('.') + 1, ipTemp.length()); ipLong = ipLong * 256 + Long.parseLong(ipTemp); return ipLong; } / * 把long类型的Ip转为一般Ip类型:xx.xx.xx.xx * * @param ip * @return */ public static String getIpFromLong(Long ip) { 
    String s1 = String.valueOf((ip & L) / L); // 255.0.0.0 ~ 1.0.0.0 截取第一个八位 String s2 = String.valueOf((ip & L) / 65536L); // 0.255.0.0 ~ 0.1.0.0 截取第二个八位 String s3 = String.valueOf((ip & 65280L) / 256L); // 0.0.255.0 ~ 0.0.1.0 截取第三个八位 String s4 = String.valueOf(ip & 255L); // 0.0.0.255 ~ 0.0.0.1 截取第四个八位 return s1 + "." + s2 + "." + s3 + "." + s4; } public static class NetInfo{ 
    private static final long VALIDATE_DATA = Long.MAX_VALUE>>31; private static final HashMap<Integer,String> NET_MASK = new HashMap<>(); private static String IP_REGEX = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\." + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\." +"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\." + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$"; // ip private String ipStr; private Long ip; // 掩码 private String maskStr; private Long mask; // 网段 private String segmentStr; private Long segment; // 广播地址 private String broadcastStr; private Long broadcast; // 开始ip private String startIpStr; private Long startIp; // 结束ip private String endIpStr; private Long endIp; // 可用ip数 private Long count; // 初始化掩码 static{ 
    NET_MASK.put(32,getIpFromLong(VALIDATE_DATA)); for(int i=1;i<32;i++) { 
    NET_MASK.put(32-i,getIpFromLong(VALIDATE_DATA << i & VALIDATE_DATA)); } } public NetInfo(String ipStr, String maskStr) { 
    this.ipStr = ipStr; this.maskStr = maskStr; checkParam(); init(); } public NetInfo(String ipStr, int mask) { 
    this(ipStr,NET_MASK.get(mask)); } public void checkParam(){ 
    if(maskStr == null || "".equals(maskStr.trim()) || !NET_MASK.containsValue(maskStr)){ 
    throw new RuntimeException("掩码无效"); } if(ipStr == null || "".equals(ipStr.trim())){ 
    throw new RuntimeException("ip地址为空"); } // 判断ip地址是否与正则表达式匹配 if (!ipStr.matches(IP_REGEX)) { 
    throw new RuntimeException("IP地址不合规范"); } } public void init(){ 
    this.ip = getIpFromString(ipStr); this.mask = getIpFromString(maskStr); // 网段 = ip & 掩码 this.segment = this.ip & this.mask; this.segmentStr = getIpFromLong(this.segment); // 广播地址 网段末尾用1补齐 this.broadcast = this.segment | (~this.mask & VALIDATE_DATA); binaryToDecimal(broadcast); this.broadcastStr = getIpFromLong(this.broadcast); // 开始地址 网段+1 this.startIp = this.segment +1; this.startIpStr = getIpFromLong(this.startIp); // 结束地址 广播地址-1 this.endIp = this.broadcast -1; this.endIpStr = getIpFromLong(this.endIp); /*for( long i = startIp;i< endIp;i++){ System.out.println(getIpFromLong(i + 1)); }*/ this.count = this.broadcast - this.startIp; } public String getIp() { 
    return ipStr; } public String getMask() { 
    return maskStr; } public String getSegment() { 
    return segmentStr; } public String getBroadcast() { 
    return broadcastStr; } public String getStartIp() { 
    return startIpStr; } public String getEndIp() { 
    return endIpStr; } public Long getCount() { 
    return count; } } } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/178509.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午5:07
下一篇 2026年3月26日 下午5:08


相关推荐

  • eNSP常用命令 华为模拟器eNSP常用命令

    eNSP常用命令 华为模拟器eNSP常用命令路由器常用命令 进入任务视图给路由器取名 进入指定接口 给当前路由器接口配置 IP 地址和子网掩码 退出接口或系统视图 启用 DHCP 指定该接口拥有 DHCP 功能 指定 DNS 服务器的 IP 地址 显示全部 ip 的路由表 显示指定 ip 路由表 添加静态路由 交换机常用命令 交换机改变语言模式 创建 vlan 查看所有 vlan 将接口拆分为多个子接口 指定接口与哪个 vlan 关联 启用 arp 广播 将接口修改为 access 接口 将接口修改为 trunk 接口 将接口划分到指定 vlan 里 查看开启 stp 后的交换机接口的接口情况 查看交换

    2026年3月16日
    1
  • 谱归一化(Spectral Normalization)的理解

    谱归一化(Spectral Normalization)的理解SpectralNorm 1 是 TakeruMiyato 在 2018 年 2 月发表的一篇将谱理论应用于 Gan 上的文章 在 2017 年 本文的第 3 作者 YuichiYoshid 就发表了一篇著名的谱范数正则 SpectralNorm 的文章 2 如有兴趣也可参看我的上一篇 Blo

    2026年3月18日
    3
  • THINKPHP and or 模板语句书写

    THINKPHP and or 模板语句书写THINKPHP and or 模板语句书写

    2022年4月21日
    52
  • MemWatch的使用「建议收藏」

    MemWatch的使用「建议收藏」博主的新Blog地址:http://www.brantchen.com欢迎訪问:)      linux下的測试工具真是少之又少,还不好用,近期试用了memwatch,感觉网上的介绍不太好,所以放在这里跟大家分享 。事实上大部分都是看的帮助,非常多地方翻译得不好还有错,请原谅指出最好看原文。假设转载或引用,请注

    2022年7月13日
    19
  • onResume的作用

    onResume的作用描述:今天在做一个功能的时候,从Aactivity跳到Bactivity。由于Bactivity的操作,影响了Aactivity的数据,所以再回到A的时候,需要A能够进行刷新操作。但是默认跳回去的时候,A界面还是上次那个。解决方案:重写Aactivity的onResume()方法,在onResume()方面里进行刷新操作。因为按照activity的生命周期模型,当activ

    2022年6月2日
    67
  • MongoDB 客户端工具(图)

    MongoDB 客户端工具(图)转自 nbsp http hi baidu com shepherdnewa blog item 962368f05d1f htmlhttp www javabloger com article mongodb gui win linux mac htmlNoSQL 的运动不止 MongoDB 作为其中的主力军发展迅猛 但是图形化工具少见

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号