如何在 C# 中将 CIDR 转换为网络和 IP 地址范围?
我一直在寻找一些 C# 代码来将 CIDR 表示法 (72.20.10.0/24) 的网络转换为 IP 地址范围,但运气不佳。 stackoverlow 上有一些关于 CIDR 的线程,但似乎没有一个有任何 C# 代码并且完全涵盖了我所需要的内容。 所以我决定自己做,并且我不希望代码在此版本中依赖 System.Net 进行任何转换。
也许这对某人有帮助。
参考文献:
“Whatmask”来自 http://www.laffeycomputer.com/ 的 C 代码Whatmask.html
用法:
uint startIP, endIP;
Network2IpRange("72.20.10.0/24", out startIP, out endIP);
该代码假定所有内容都是 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;
}
请随时提交您的改进。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
以下是如何将 CIDR 表示法转换为 T-SQL 中的范围,来自我的博客文章:
Here's how to convert CIDR notation to a range in T-SQL, from my blog post :
对于
network/maskBits
,步骤如下,您可以通过这两种方式之一计算
mask
,那么范围是,
更准确地说,
其中,
<<
是按位左移(无翻转)&
是按位 AND,|
是按位 OR,~
是按位反转。The steps would go like this for a
network/maskBits
,You compute the
mask
in one of these two ways,then the range is,
More precisely,
Where,
<<
is bitwise left shift (without rollover)&
is bitwise AND,|
is bitwise OR, and~
is bitwise INVERT.以下是示例
72.20.10.0/24
的操作方法,让
Network
为72.20.10.0
掩码
为~((1 << (32-24)) - 1)
// 或Mask
是~(0xFFFFFFFF >> 24)
,0xFFFFFF00
StartIP 是 --
(网络和掩码)
;72.20.10.0 & 0xFFFFFF00
EndIP 是 --
((网络和掩码) | ~Mask)
;(72.20.10.0 & 0xFFFFFF00) | 0x000000FF
这将是
72.20.10.0 -- 72.20.10.255
。Here is how you do it for your example
72.20.10.0/24
,Let
Network
be72.20.10.0
Mask
is~((1 << (32-24)) - 1)
// orMask
is~(0xFFFFFFFF >> 24)
0xFFFFFF00
StartIP is --
(Network & Mask)
;72.20.10.0 & 0xFFFFFF00
EndIP is --
((Network & Mask) | ~Mask)
;(72.20.10.0 & 0xFFFFFF00) | 0x000000FF
This will be
72.20.10.0 -- 72.20.10.255
.我建议使用 Github 中的 C# IPNetwork 类。
它将输出
玩得开心。
I recommend to use the C# IPNetwork class from Github.
It will ouput
Have fun.