【问题标题】:How to subtract an IP address? ( both IPv4 and IPv6)如何减去IP地址? (IPv4和IPv6)
【发布时间】:2011-06-09 23:48:04
【问题描述】:

对于 IPv4 和 IPv6 范围,我需要获取由 startIP 和 endIP 标识的 IP 范围内的 IP 地址数。

谁能指出可以用来实现IP地址减法的方法?

IP 地址的数量将是 = endIP - startIP + 1

非常感谢任何回复。

【问题讨论】:

  • 您需要澄清一点:对于第零个近似值,您可以将地址转换为 32 位或 128 位无符号整数并减去这些值。但是:这并不能告诉您获得了多少不同的可分配 IP,因为它计算的是广播 IP,并且没有考虑子网。
  • 广播地址或其他特殊地址无所谓。我的要求是获得两个 IP 地址的算术差异以及 C# 中可以保存这些值的数据结构(特别是 ipv6)。

标签: c#-3.0 ip-address


【解决方案1】:
class Program          
{  
static void Main(string[] args)   
    {   
        string a = "192.168.11.12";
        string b = "192.168.12.12";
        int diff = Math.Abs(IPToInt(a) - IPToInt(b)) + 1;
    } 
int IPToInt(string IP) 
{ 
    return IPAddress.NetworkToHostOrder(BitConverter.ToInt32(IPAddress.Parse(IP).GetAddressBytes(), 0)); 
}       
} 

【讨论】:

    【解决方案2】:

    怎么样?

    class Program
    {
    
        static void Main(string[] args)
        {
            IPAddress a = new IPAddress(new byte[] { 192, 168, 11, 12 });
            IPAddress b = new IPAddress(new byte[] { 192, 168, 12, 12 });
            long diff = Difference(a, b);
        }
    
        private static Int64 ConvertToLong(IPAddress a)
        {
            byte[] addressBits = a.GetAddressBytes();
            Int64 retval = 0;
            for (int i = 0; i < addressBits.Length; i++)
            {
                retval = (retval << 8) + (int)addressBits[i];
            }
    
            return retval;
        }
    
        private static Int64 Difference(IPAddress a, IPAddress b)
        {
            return Math.Abs(ConvertToLong(a) - ConvertToLong(b)) - 1;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2013-07-02
      • 1970-01-01
      • 2011-11-09
      • 2019-07-13
      • 2012-12-25
      • 1970-01-01
      • 2012-05-22
      • 2011-02-16
      • 2016-09-20
      相关资源
      最近更新 更多