美文网首页
将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