首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >[java]根据ip和掩码计算网段、广播地址及可用ip地址范围

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

作者头像
master336
发布2026-06-15 19:34:46
发布2026-06-15 19:34:46
580
举报

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

  • IP: 网络地址
  • 掩码: 指明一个IP地址的哪些位标识的是主机所在的子网。
  • 网段:网络中可通信的部分,一般用子网第一个地址表示。
  • 广播地址:专门用于同时向网络中所有工作站进行发送的一个地址;一般用子网最后一个地址表示。
  • 可用子网ip:一般指子网中去除网段、广播地址的地址范围 参考资料:
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
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 & 4278190080L) / 16777216L); // 255.0.0.0 ~ 1.0.0.0 截取第一个八位
        String s2 = String.valueOf((ip & 16711680L) / 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;
        }
    }
}  
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-06-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ip地址与掩码、网段、广播地址、可用ip范围
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档