duanlu5055 2016-01-08 08:42
浏览 623
已采纳

在Golang中将网络掩码号转换为32位

I am trying to get the IP address and subnet mask by

ifaces, err := net.Interfaces()
for _, iface := range ifaces{
        localip, _ = iface.Addrs()
}

However, I am looking forward to get the subnet as something like 255.255.255.0 rather than /24. How can I get that? If there are no modules that can do this, what is the logic to do this as a program?

  • 写回答

4条回答 默认 最新

  • 普通网友 2016-01-08 09:58
    关注

    Borrowed from some stackoverflow post itself, using logical operators.

    mask = (0xFFFFFFFF << (32 - 24)) & 0xFFFFFFFF; //24 is the netmask
    var dmask uint64
    dmask = 32
    localmask := make([]uint64, 0, 4)
    for i := 1; i <= 4; i++{
        tmp := mask >> (dmask - 8) & 0xFF
        localmask = append(localmask, tmp)
        dmask -= 8
    }
    
    fmt.Println(localmask)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • dongman2721 2016-01-08 10:12
    关注
    func main() {
        ifaces, err := net.Interfaces()
        if err != nil {
            panic(err)
        }
        for _, iface := range ifaces {
            addrs, _ := iface.Addrs()
            for _, addr := range addrs {
                cidr := addr.String()
                mask, err := mask(cidr)
                if err != nil {
                    fmt.Println("extracting mask failed:", err)
                }
                i, err := mtoi(mask)
                if err != nil {
                    fmt.Println("creating uint16 from mask failed:", err)
                }
                fmt.Printf("CIDR: %s\tMask: %d
    ", cidr, i)
            }
        }
    }
    
    // Extracts IP mask from CIDR address.
    func mask(cidr string) (net.IPMask, error) {
        _, ip, err := net.ParseCIDR(cidr)
        return ip.Mask, err
    }
    
    // Converts IP mask to 16 bit unsigned integer.
    func mtoi(mask net.IPMask) (uint16, error) {
        var i uint16
        buf := bytes.NewReader(mask)
        err := binary.Read(buf, binary.BigEndian, &i)
        return i, err
    }
    
    评论
  • douzhi8244 2016-01-08 10:34
    关注

    You could implement a function like:

    func parseMask(ipaddr string) (mask string, err error) {
        removeExtra := regexp.MustCompile("^(.*[\\/])")
        asd := ipaddr[len(ipaddr)-3:]
        findSubnet := removeExtra.ReplaceAll([]byte(asd), []byte(""))
        subnet, err := strconv.ParseInt(string(findSubnet), 10, 64)
        if err != nil {
            return "", errors.New("Parse Mask: Error parsing mask")
        }
        var buff bytes.Buffer
        for i := 0; i < int(subnet); i++ {
            buff.WriteString("1")
        }
        for i := subnet; i < 32; i++ {
            buff.WriteString("0")
        }
        masker := buff.String()
        a, _ := strconv.ParseUint(masker[:8], 2, 64)
        b, _ := strconv.ParseUint(masker[8:16], 2, 64)
        c, _ := strconv.ParseUint(masker[16:24], 2, 64)
        d, _ := strconv.ParseUint(masker[24:32], 2, 64)
        resultMask := fmt.Sprintf("%v.%v.%v.%v", a, b, c, d)
        return resultMask, nil
    }
    

    and then call it:

    func main() {
        ifaces, _ := net.Interfaces()
        for _, iface := range ifaces {
            localip, _ := iface.Addrs()
            for _, ip := range localip {
                done, _ := parseMask(ip.String())
                log.Println(done) // 255.255.255.0
            }
        }
    }
    
    评论
  • douzhanhui5662 2017-11-13 23:10
    关注

    Converting netmask to type "IP" before printing does the trick:

    func mask_print(ipnet *net.IPNet){
      fmt.Println("%v", net.IP(ipnet.Mask))      
    }
    
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥20 C语言用栈实现无向图邻接矩阵广度优先遍历
  • ¥15 C++代码报错问题,c++20协程
  • ¥15 c++图Djikstra算法求最短路径
  • ¥15 Linux操作系统中的,管道通信问题
  • ¥15 ansible tower 卡住
  • ¥15 等间距平面螺旋天线方程式
  • ¥15 通过链接访问,显示514或不是私密连接
  • ¥100 系统自动弹窗,键盘一接上就会
  • ¥50 股票交易系统设计(sql语言)
  • ¥15 调制识别中这几个数据集的文献分别是什么?