java.net cidr接口_【算法】CIDR集合的算法

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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值