为了账号安全,请及时绑定邮箱和手机立即绑定

Go中将网络掩码转换为CIDR

Go中将网络掩码转换为CIDR

Go
繁花不似锦 2023-07-17 15:17:29
我正在寻找一种将网络掩码字符串转换为 Go 中的 CIDR 表示法的方法。例如,“255.255.255.0”->“/24”我目前正在使用以下逻辑获取 IP 地址和网络掩码字符串,这可能会使事情变得复杂。我一直在仔细阅读该net库,试图看看是否有不同的函数可以用来完成我想要的功能,这实际上只是 CIDR 表示法中的 IP 地址:192.168.1.2/24var mgmtInterface *net.Interfacevar err errormgmtInterface, 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])} 
查看完整描述

3 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

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

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


查看完整回答
反对 回复 2023-07-17
?
GCT1015

TA贡献1827条经验 获得超4个赞

使用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


查看完整回答
反对 回复 2023-07-17
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

我不知道这样的功能是否存在,但创建一个很容易。


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))

}



查看完整回答
反对 回复 2023-07-17
  • 3 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信