net.IPNet类型中,我们具有Contains方法来检查其中是否包含net.IP。但是我想要知道的是net.IPNet是否在另一个net.IPNet中。我尝试了使用big.Int的解决方案,但没有用(而且,功能接口很糟糕)。有任何想法吗?

// ipnet2 contains ipnet1 ?
func ContainsCIDR(ipnet1, ipnet2 net.IPNet) bool {
    var begin big.Int
    begin.SetBytes([]byte(ipnet1.IP))

    var mask big.Int
    mask.SetBytes([]byte(ipnet1.Mask))

    var diff big.Int
    diff.Xor(&begin, &mask)

    var end big.Int
    end.Add(&begin, &diff)

    ipBegin := net.IP(begin.Bytes())
    ipEnd := net.IP(end.Bytes())

    return ipnet2.Contains(ipBegin) && ipnet2.Contains(ipEnd)
}

最佳答案

检查外部子网的掩码是否与内部子网相同或小于内部子网,然后验证外部子网中是否包含内部子网的起始地址:

func ContainsCIDR(ipnet1, ipnet2 *net.IPNet) bool {
    ones1, _ := ipnet1.Mask.Size()
    ones2, _ := ipnet2.Mask.Size()
    return ones1 <= ones2 && ipnet1.Contains(ipnet2.IP)
}

关于go - net.IPNet内其他net.IPNet?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40406230/

10-12 16:19