我一直在寻找一些C#代码来将CIDR表示法(72.20.10.0/24)中的网络转换为IP地址范围,没有太多运气.stackoverlow上有一些关于CIDR的线程,但似乎没有任何C#代码可以覆盖我需要的内容.所以我决定自己做饭,我不希望代码依赖System.Net进行此版本的任何转换.
也许它可能对某人有所帮助.
参考文献:
来自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)
玩得开心.
以下是你如何为你的例子做的72.20.10.0/24,
让Network是72.20.10.0
Mask为~((1 << (32-24)) - 1)//或者
Mask是~(0xFFFFFFFF >> 24)
0xFFFFFF00StartIP是 - (Network & Mask);
72.20.10.0 & 0xFFFFFF00EndIP是 - ((Network & Mask) | ~Mask);
(72.20.10.0 & 0xFFFFFF00) | 0x000000FF这将是72.20.10.0 -- 72.20.10.255.
步骤将像这样进行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)
在哪里,
<<是按位左移(无翻转)&是按位与,|是按位或,并且~是按位反转。| 归档时间: |
|
| 查看次数: |
24739 次 |
| 最近记录: |