Investigamos en todo internet para así traerte la solución para tu duda, si tienes alguna inquietud puedes dejar tu inquietud y contestaremos porque estamos para servirte.
Solución:
256 - 240 = 16 = 2**4, 32 - 4 = 28
No es realmente una pregunta de C#.
Para obtener una dirección de red de una IP y una máscara, puede aplicar por bytes and
a la IP y máscara. Puede obtener bytes de un string usando IPAddress.Parse()
y IPAddress.GetAddressBytes()
.
Tuve que hacer lo mismo, no hay información nueva, pero este fragmento puede ser útil para la próxima persona que busque una manera de hacer esto en C#. tenga en cuenta que este método solo cuenta la cantidad de 1 consecutivos y le deja el trabajo de agregarlo a la IP.
public class IPAddressHelper
public static UInt32 SubnetToCIDR(string subnetStr)
IPAddress subnetAddress = IPAddress.Parse(subnetStr);
byte[] ipParts = subnetAddress.GetAddressBytes();
UInt32 subnet = 16777216 * Convert.ToUInt32(ipParts[0]) + 65536 * Convert.ToUInt32(ipParts[1]) + 256 * Convert.ToUInt32(ipParts[2]) + Convert.ToUInt32(ipParts[3]);
UInt32 mask = 0x80000000;
UInt32 subnetConsecutiveOnes = 0;
for (int i = 0; i < 32; i++)
if (!(mask & subnet).Equals(mask)) break;
subnetConsecutiveOnes++;
mask = mask >> 1;
return subnetConsecutiveOnes;
¡Mantenlo simple!
Esto funciona solo para IPv4pero dado que IPv6 solo admite CIDR como /64
en fe80::1ff:fe23:4567:890a/64
Cálculos como ese son innecesarios allí.
Todo lo que necesita para una máscara de red IPv4:
int cidr = Convert.ToString(mask.Address, 2).Count( o => o == '1');
Explicación basada en el ejemplo dado:
IPAddress mask = new IPAddress(new byte[] 255, 255, 255, 240 );
// maskBinAsString = 11110000111101001111111111111111
string maskBinAsString = Convert.ToString(mask.Address, 2);
// cidr = 28
int cidr = Convert.ToString(mask.Address, 2).Count( o=> o == '1');
Si te gustó nuestro trabajo, puedes dejar una crónica acerca de qué te ha impresionado de este post.