Вот как вы это делаете для своего примера 72.20.10.0 / 24
,
Пусть Сеть
будет 72.20.10.0
Маска
будет ~ ((1 << (32-24)) - 1)
// или
Маска
- это ~ (0xFFFFFFFF >> 24)
0xFFFFFF00
StartIP - (Сеть и маска )
;
72.20.10.0 & 0xFFFFFF00
EndIP - ((Сеть и маска) | ~ Маска)
;
(72.20.10.0 & 0xFFFFFF00) | 0x000000FF
Это будет 72.20.10.0 - 72.20.10.255
.
Шаги будут выглядеть так для network / maskBits
,
. Вы вычисляете маску
одним из этих двух способов,
mask = ~((1 << (32 - maskBits)) - 1) // or,
mask = ~(0xFFFFFFFF >> maskBits)
тогда диапазон равен
StartIP = network
EndIP = network | ~mask
Точнее
StartIP = network & mask
EndIP = (network & mask) | ~mask
Где,
<<
- побитовый сдвиг влево (без переворота) &
- побитовое И, |
- это побитовое ИЛИ, а ~
- побитовое ОБРАТЕНИЕ. Я рекомендую использовать класс C # IPNetwork из Github .
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);
Он будет выводить
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
Удачи.