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

在golang中将网络掩码数转换为32位

在golang中将网络掩码数转换为32位

Go
白板的微信 2021-12-06 19:47:30
我正在尝试通过以下方式获取 IP 地址和子网掩码ifaces, err := net.Interfaces()for _, iface := range ifaces{        localip, _ = iface.Addrs()}但是,我期待将子网作为类似255.255.255.0而不是/24. 我怎样才能得到那个?如果没有模块可以做到这一点,那么作为程序来做到这一点的逻辑是什么?
查看完整描述

3 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

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\n", 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

}


查看完整回答
反对 回复 2021-12-06
?
慕容森

TA贡献1853条经验 获得超18个赞

借用一些 stackoverflow 帖子本身,使用逻辑运算符。


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)


查看完整回答
反对 回复 2021-12-06
?
万千封印

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

您可以实现如下功能:


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

}

然后调用它:


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

        }

    }

}


查看完整回答
反对 回复 2021-12-06
  • 3 回答
  • 0 关注
  • 357 浏览
慕课专栏
更多

添加回答

举报

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