CIDR(Classless Inter-Domain Routing)是“无类别域间路由”的缩写。是当前用来表示路由的一种方式。由于在做某产品的时候需要用到CIDR集合的一些算法,例如集合的交集、并集、补集运算。下面给出相应的实现代码。
首先是CIDR的结构:public sealed class CIDR : IXmlSerializable, IComparable
{
private byte[] bytes = null;
public IPAddress IPAddress { get; private set; }
public int Subnet { get; private set; }
public override bool Equals(object obj)
{
CIDR cidr = obj as CIDR;
if (cidr == null)
return false;
return this.Subnet == cidr.Subnet && this.IPAddress.Equals(cidr.IPAddress);
}
public override int GetHashCode()
{
return this.IPAddress.GetHashCode() ^ this.Subnet.GetHashCode();
}
public override string ToString()
{
return string.Format("{0}/{1}", IPAddress, Subnet);
}
public static CIDR Parse(string str)
{
CIDR cidr = new CIDR();
cidr.SetFromString(str);
return cidr;
}
private void SetFromString(string str)
{
int i = str.IndexOf('/');
this.IPAddress = IPAddress.Parse(str.Substring(0, i));
this.Subnet = int.Parse(str.Substring(i + 1));
this.bytes = this.IPAddress.GetAddressBytes();
int length = this.bytes.Length << 3;
if (this.Subnet < 0 || this.Subnet > length)
throw new ArgumentException("", "str");
// can optimize
for (i = this.Subnet + 1; i <= length; i++)
{
int bit = (bytes[(i - 1) >> 3] >> ((8 - i) & 7)) & 1;
if (bit != 0)
throw new ArgumentException("", "str");
}
}
public bool IsIPv6
{
get { return this.IPAddress.AddressFamily == AddressFamily.InterNetworkV6; }
}
#region IXmlSerializable
XmlSchema IXmlSerializable.GetSchema()
{
return null;
}
void IXmlSerializable.ReadXml(XmlReader reader)
{
this.SetFromString(reader.ReadElementContentAsString());
}
void IXmlSerializable.WriteXml(XmlWriter writer)
{
writer.WriteString(this.