如何在C#中将CIDR转换为网络和IP地址范围?

Kur*_*urt 15 c# cidr

我一直在寻找一些C#代码来将CIDR表示法(72.20.10.0/24)中的网络转换为IP地址范围,没有太多运气.stackoverlow上有一些关于CIDR的线程,但似乎没有任何C#代码可以覆盖我需要的内容.所以我决定自己做饭,我不希望代码依赖System.Net进行此版本的任何转换.

也许它可能对某人有所帮助.

参考文献:

从网络bitcount转换为网络掩码的最佳方法是什么?

来自http://www.laffeycomputer.com/whatmask.html的 "Whatmask"C代码

用法:

uint startIP, endIP;  
Network2IpRange("72.20.10.0/24", out startIP, out endIP); 
Run Code Online (Sandbox Code Playgroud)

代码假设一切都是32位.

static void Network2IpRange(string sNetwork, out uint startIP, out uint endIP)
{           
    uint ip,        /* ip address */
        mask,       /* subnet mask */               
        broadcast,  /* Broadcast address */
        network;    /* Network address */

    int bits;               

    string[] elements = sNetwork.Split(new Char[] { '/' });         

    ip = IP2Int(elements[0]);
    bits = Convert.ToInt32(elements[1]);

    mask = ~(0xffffffff >> bits);

    network = ip & mask;
    broadcast = network + ~mask;

    usableIps = (bits >30)?0:(broadcast - network - 1); 

    if (usableIps <= 0)
    {
        startIP = endIP = 0; 
    }
    else
    {
        startIP = network + 1;              
        endIP = broadcast - 1;
    }
}

public static uint IP2Int(string IPNumber)
{
    uint ip = 0;
    string[] elements = IPNumber.Split(new Char[] { '.' });
    if (elements.Length==4)
    {
        ip  = Convert.ToUInt32(elements[0])<<24;
        ip += Convert.ToUInt32(elements[1])<<16;
        ip += Convert.ToUInt32(elements[2])<<8;
        ip += Convert.ToUInt32(elements[3]);
    }
    return ip;
}
Run Code Online (Sandbox Code Playgroud)

随意提交您的改进.

小智 17

我建议使用Github的C#IPNetwork类.

string net = "192.168.168.100/24";
IPNetwork ipnetwork = IPNetwork.Parse(net);

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);
Run Code Online (Sandbox Code Playgroud)

它会输出

Network : 192.168.168.0
Netmask : 255.255.255.0
Broadcast : 192.168.168.255
FirstUsable : 192.168.168.1
LastUsable : 192.168.168.254
Usable : 254 
Cidr : 24
Run Code Online (Sandbox Code Playgroud)

玩得开心.


nik*_*nik 7

以下是你如何为你的例子做的72.20.10.0/24,

Network72.20.10.0
Mask~((1 << (32-24)) - 1)//或者
Mask~(0xFFFFFFFF >> 24)

  • 是的 0xFFFFFF00

StartIP是 - (Network & Mask);

  • 是的 72.20.10.0 & 0xFFFFFF00

EndIP是 - ((Network & Mask) | ~Mask);

  • 是的 (72.20.10.0 & 0xFFFFFF00) | 0x000000FF

这将是72.20.10.0 -- 72.20.10.255.


nik*_*nik 5

步骤将像这样进行network/maskBits

mask您可以通过以下两种方式之一计算,

mask = ~((1 << (32 - maskBits)) - 1) // or,
mask = ~(0xFFFFFFFF >> maskBits)
Run Code Online (Sandbox Code Playgroud)

那么范围是

StartIP = network 
EndIP   = network | ~mask
Run Code Online (Sandbox Code Playgroud)

更确切地说,

StartIP = network & mask
EndIP   = (network & mask) | ~mask
Run Code Online (Sandbox Code Playgroud)

在哪里,

  • <<是按位左移(无翻转)
  • &是按位与,
  • |是按位或,并且
  • ~是按位反转。