在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/