Go语言基于ip集合推出对应的CIDR

文章介绍了如何在Go语言中使用net包的CIDR函数将IP地址转换为CIDR表示,并提供了合并相邻CIDR子网的代码实现。通过获取IP和CIDR掩码,然后对CIDR子网进行排序和比较,最终合并成不重复的子网范围。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

个人博客

实现步骤

Go语言中可以基于net包中的CIDR函数来将一组IP地址转换为CIDR,步骤主要分两步:

  1. 通过ip地址获取对应的ip和CIDR掩码信息,默认为32位
  2. 合并相邻CIDR子网

代码实现

实现代码如下:

1.获取每个ip对应的CIDR

// 通过ip地址获取对应的ip和CIDR掩码信息,默认为32位  
IPNet: net.IPNet{
		IP:   net.ParseIP(IPAddress),
        //  用ones和bits来一个CIDR掩码
		Mask: net.CIDRMask(IPOnes, 32),
}
					

2.合并子网CIDR

func MergeCIDRs(cidrs []*net.IPNet) []*net.IPNet {
    // 先按照IP地址排序
    sort.Slice(cidrs, func(i, j int) bool {
    return bytes.Compare(cidrs[i].IP, cidrs[j].IP) < 0
    })

// 合并相邻的CIDR
mergedCIDRs := make([]*net.IPNet, 0, len(cidrs))
currentCIDR := cidrs[0]
for i := 1; i < len(cidrs); i++ {
    if currentCIDR.Contains(cidrs[i].IP) {
        continue
    }
    if bytes.Equal(currentCIDR.Mask, cidrs[i].Mask) && currentCIDR.IP.Equal(cidrs[i].IP.Mask(currentCIDR.Mask)) {
        currentCIDR = &net.IPNet{
            IP:   currentCIDR.IP,
            Mask: currentCIDR.Mask,
        }
        continue
    }
    mergedCIDRs = append(mergedCIDRs, currentCIDR)
    currentCIDR = cidrs[i]
}
  mergedCIDRs = append(mergedCIDRs, currentCIDR)

  return mergedCIDRs
}

3.测试

cidrs := []*net.IPNet{
&net.IPNet{IP: net.ParseIP(“192.168.0.0”), Mask: net.CIDRMask(24, 32)},
&net.IPNet{IP: net.ParseIP(“192.168.1.0”), Mask: net.CIDRMask(24, 32)},
&net.IPNet{IP: net.ParseIP(“192.168.2.0”), Mask: net.CIDRMask(24, 32)},
&net.IPNet{IP: net.ParseIP(“192.168.1.0”), Mask: net.CIDRMask(25, 32)},
&net.IPNet{IP: net.ParseIP(“192.168.1.128”), Mask: net.CIDRMask(25, 32)},
}
mergedCIDRs := MergeCIDRs(cidrs)
for _, c := range mergedCIDRs {
fmt.Printf(“%s\n”, c.String())
}
输出结果为:
192.168.0.0/23
192.168.2.0/24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天一个秃顶小技巧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值