美文网首页
将ipv4格式的子网掩码转换为整型数字

将ipv4格式的子网掩码转换为整型数字

作者: 池边树下 | 来源:发表于2020-11-05 14:27 被阅读0次
func main() {
    fmt.Println(MaskToInt("128.0.0.0"))
    fmt.Println(MaskToInt("255.0.0.0"))
    fmt.Println(MaskToInt("255.255.0.0"))
    fmt.Println(MaskToInt("255.255.255.0"))
    fmt.Println(MaskToInt("255.255.255.255"))
}

func IsIP(host string) bool {
    return net.ParseIP(host) != nil
}

// 将ipv4格式的子网掩码转换为整型数字
// 如 255.255.255.0 对应的整型数字为 24
func MaskToInt(netmask string) (int, error) {
    ipSplitArr := strings.Split(netmask, ".")

    if len(ipSplitArr) != 4 || !IsIP(netmask) {
        return 0, fmt.Errorf("netmask格式不正确:%v", netmask)
    }
    ipv4MaskArr := make([]byte, 4)
    for i, value := range ipSplitArr {
        intValue, err := strconv.Atoi(value)
        if err != nil {
            return 0, fmt.Errorf("转换成int类型失败:[%v]", err)
        }
        divisor := 128           // 最大因子
        for i := 0; i < 8; i++ { // 非标准值自动适配
            val := 256 - divisor
            if intValue <= val && intValue != 0 {
                intValue = val
                break
            }
            divisor = divisor / 2 // 因子间隔为2倍
        }
        ipv4MaskArr[i] = byte(intValue)
    }
    mask, _ := net.IPv4Mask(ipv4MaskArr[0], ipv4MaskArr[1], ipv4MaskArr[2], ipv4MaskArr[3]).Size()
    return mask, nil
}

结果:


image.png

相关文章

网友评论

      本文标题:将ipv4格式的子网掩码转换为整型数字

      本文链接:https://www.haomeiwen.com/subject/wvoovktx.html