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