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



繁花不似锦
浏览 116回答 3
3回答

德玛西亚99

起初这不是很明显,但是:addr := ip.To4() sz, _ := net.IPV4Mask(addr[0], addr[1], addr[2], addr[3]).Size()

GCT1015

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

饮歌长啸

我不知道这样的功能是否存在,但创建一个很容易。CIDR 表示法只是网络掩码中设置位的计数。所以,粗略的解决方案可能是:func cidr(netmask string) int {&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; var mask uint32&nbsp; &nbsp; for idx, dotpart := range strings.Split(netmask, ".") {&nbsp; &nbsp; &nbsp; &nbsp; part, _ := strconv.Atoi(dotpart)&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; mask = mask | uint32(part) << uint32(24-idx*8)&nbsp; &nbsp; }&nbsp; &nbsp;&nbsp; &nbsp; return len(fmt.Sprintf("%b", mask))}
打开App,查看更多内容
随时随地看视频慕课网APP