代码之家  ›  专栏  ›  技术社区  ›  Anheledir

在给定IP地址和网络掩码时,如何计算IP范围?

  •  36
  • Anheledir  · 技术社区  · 15 年前

    CIDR Notation )我需要用C#计算这个范围内包含的第一个和最后一个ip地址。

    例子:

    输入:

    结果: 192.168.0.1 - 192.168.0.126

    8 回复  |  直到 13 年前
        1
  •  64
  •   balexandre    4 年前

    我的好朋友 Alessandro 有一个 nice post 关于C#中的位运算符,您应该阅读相关内容,以便知道该怎么做。

    这很容易 . 如果将提供给您的IP分解为二进制,则网络地址是所有主机位(子网掩码中的0)均为0的IP地址,最后一个地址广播地址是所有主机位均为1的IP地址。

    ip 192.168.33.72 mask 255.255.255.192
    
    11111111.11111111.11111111.11000000 (subnet mask)
    11000000.10101000.00100001.01001000 (ip address)
    

    粗体部分是主机位(其余是网络位)。如果将IP上的所有主机位都设置为0,则会得到第一个可能的IP:

    11000000.10101000.00100001.01000000 (192.168.33.64)
    

    11000000.10101000.00100001.01111111 (192.168.33.127)
    

    以我为例:

    the network is "192.168.33.64/26":
    Network address: 192.168.33.64
    First usable: 192.168.33.65 (you can use the network address, but generally this is considered bad practice)
    Last useable: 192.168.33.126
    Broadcast address: 192.168.33.127
    
        2
  •  28
  •   Joren    15 年前

    IPAddress ip = new IPAddress(new byte[] { 192, 168, 0, 1 });
    int bits = 25;
    
    uint mask = ~(uint.MaxValue >> bits);
    
    // Convert the IP address to bytes.
    byte[] ipBytes = ip.GetAddressBytes();
    
    // BitConverter gives bytes in opposite order to GetAddressBytes().
    byte[] maskBytes = BitConverter.GetBytes(mask).Reverse().ToArray();
    
    byte[] startIPBytes = new byte[ipBytes.Length];
    byte[] endIPBytes = new byte[ipBytes.Length];
    
    // Calculate the bytes of the start and end IP addresses.
    for (int i = 0; i < ipBytes.Length; i++)
    {
        startIPBytes[i] = (byte)(ipBytes[i] & maskBytes[i]);
        endIPBytes[i] = (byte)(ipBytes[i] | ~maskBytes[i]);
    }
    
    // Convert the bytes to IP addresses.
    IPAddress startIP = new IPAddress(startIPBytes);
    IPAddress endIP = new IPAddress(endIPBytes);
    
        3
  •  8
  •   Vladislav Rastrusny    15 年前

    反转掩码(异或加1),并使用IP进行转换。添加1。这将是起始范围。 或带面罩的IP。这将是结束范围。

        4
  •  8
  •   Jamison Ye    13 年前

    我是在网络部署岗位上学习到这个快捷方式的。这对我帮助很大,我想我会和大家分享这个秘密。到目前为止,我还没有找到一种我所知道的更简单的上网方式。

    例如,网络192.115.103.64/27的范围是多少?

    请记住子网掩码是0、128、192、224、240、248、252、254、255

    255.255.255.254 11111111.11111111.11111111.11111110 /31

    255.255.255.252 11111111.11111111.11111111.11111100 /30

    255.255.255.248 11111111.11111111.11111111.11111000 /29

    255.255.255.240 11111111.11111111.11111111.11110000 /28

    255.255.255.192 11111111.11111111.11111111.11000000 /26

    255.255.255.128 11111111.11111111.11111111.10000000 /25

    255.255.255.0 11111111.11111111.11111111.00000000 /24

    这里是数学的来源:

    使用前面列出的子网掩码的子网掩码-子网掩码 在这种情况下,224-192=32

    这是64-96的范围。

    第一台主机为65。(第一个网络+1)

    最后一位主持人是94。(广播-1)

    广播是95。(最后一个网络-1)

        5
  •  5
  •   LukeSkywalker    9 年前

    我建议使用IPNetwork库 https://github.com/lduchosal/ipnetwork .

    IPv4

      IPNetwork ipnetwork = IPNetwork.Parse("192.168.0.1/25");
    
      Console.WriteLine("Network : {0}", ipnetwork.Network);
      Console.WriteLine("Netmask : {0}", ipnetwork.Netmask);
      Console.WriteLine("Broadcast : {0}", ipnetwork.Broadcast);
      Console.WriteLine("FirstUsable : {0}", ipnetwork.FirstUsable);
      Console.WriteLine("LastUsable : {0}", ipnetwork.LastUsable);
      Console.WriteLine("Usable : {0}", ipnetwork.Usable);
      Console.WriteLine("Cidr : {0}", ipnetwork.Cidr);
    

    输出

      Network : 192.168.0.0
      Netmask : 255.255.255.128
      Broadcast : 192.168.0.127
      FirstUsable : 192.168.0.1
      LastUsable : 192.168.0.126
      Usable : 126
      Cidr : 25
    

        6
  •  4
  •   Pavlin    8 年前

    输入: 192.168.0.1/25

    /25

    要查找网络地址,请执行以下操作:

    • 在给定的ip地址中 192.168.0.1 11111111 11111111 00000000 00000001 现在,从右侧“0”中提取7位 1111111 11111111 00000000 00000000 以十进制表示的是: 192.168.0.0 (这是网络地址)

    要查找第一个有效/可用ip地址,请将+1添加到网络地址,即:

    (32掩码)从右到“1”的位

    即: 11111111 11111111 00000000 01111111 十进制的哪个是 192.168.0.127

    192.168.0.126

        7
  •  2
  •   Trevor Tippins    15 年前

    你可能已经知道了这一点,但要检查你是否把这些东西弄对了,请看一看 http://www.subnet-calculator.com/ -您可以在那里看到位如何表示地址的网络和主机部分。

    推荐文章