在 Go 中将网络掩码转换为 CIDR



我正在寻找一种在 Go 中将网络掩码字符串转换为 CIDR 符号的方法。

例如,"255.255.255.0" -> "/24">

我目前正在使用以下逻辑获取 IP 地址和网络掩码字符串,这可能只会使事情复杂化。

我一直在仔细阅读net库,试图看看是否有不同的函数可以用来完成我想要的,这实际上只是一个 CIDR 表示法的 IP 地址:

192.168.1.2/24
var mgmtInterface *net.Interface
var err error
mgmtInterface, err = net.InterfaceByName("eth0")
if err != nil {
log.Println("Unable to find interface eth0, trying en0")
mgmtInterface, err = net.InterfaceByName("en0")
}
addrs, err := mgmtInterface.Addrs()
if err != nil {
log.Println("interface has no address")
}
for _, addr := range addrs {
var ip net.IP
var mask net.IPMask
switch v := addr.(type) {
case *net.IPNet:
ip = v.IP
mask = v.Mask
case *net.IPAddr:
ip = v.IP
mask = ip.DefaultMask()
}
if ip == nil {
continue
}
ip = ip.To4()
if ip == nil {
continue
}
// create the netmask
cleanMask := fmt.Sprintf("%d.%d.%d.%d", mask[0], mask[1], mask[2], mask[3])
} 

起初这不是很明显,但是:

addr := ip.To4()
sz, _ := net.IPV4Mask(addr[0], addr[1], addr[2], addr[3]).Size()

我不知道这种函数的存在,但创建一个很容易。

CIDR 表示法只是网络掩码中设置位的计数。

因此,粗略的解决方案可能是:

func cidr(netmask string) int {       
var mask uint32
for idx, dotpart := range strings.Split(netmask, ".") {
part, _ := strconv.Atoi(dotpart)    
mask = mask | uint32(part) << uint32(24-idx*8)
}   
return len(fmt.Sprintf("%b", mask))
}

使用 IPAddress Go 库非常简单。 请注意,此代码同样适用于 IPv4 和 IPv6。 免责声明:我是项目经理。

import (
"fmt"
"github.com/seancfoley/ipaddress-go/ipaddr"
)
func main() {
maskStr := "255.255.255.0"
pref := ipaddr.NewIPAddressString(maskStr).GetAddress().
GetBlockMaskPrefixLen(true)
fmt.Printf("prefix length for %s is %d", maskStr, pref.Len())
}

输出:

prefix length for 255.255.255.0 is 24

最新更新