Я немного искал, чтобы найти код C# для преобразования сети в нотации CIDR (72.20.10.0/24) в диапазон IP-адресов, без большой удачи. Есть несколько потоков о CIDR на stackoverlow, но ни один из них не имеет кода на C# и не охватывает именно то, что мне нужно. Поэтому я решил приготовить его сам, и я не хотел, чтобы код полагался на System.Net для любых преобразований в этой версии.Как конвертировать CIDR в сеть и диапазон IP-адресов в C#?
Возможно, это может помочь кому-то.
Список литературы:
What's the best way to convert from network bitcount to netmask?
"Whatmask" С код из http://www.laffeycomputer.com/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;
}
Не стесняйтесь представить свои улучшения.
Это было полезно для меня, спасибо. –