Solución:
Aquí hay una forma de manejarlo, sin usar ninguna función de biblioteca, para aclarar lo que está sucediendo y para ayudar si alguien necesita implementarlo en otros idiomas más adelante.
El código primero convierte el CIDR en un número de 32 bits, luego crea la máscara para determinar la dirección inicial, usa la inversa de la máscara para determinar la dirección final y luego vuelve a convertir al formato CIDR.
Tenga en cuenta que no hay detección de errores, por lo que la entrada debe estar en formato abcd / m.
La conversión de la dirección IP es simplemente una simple concatenación de los cuatro octetos en forma de big endian (AABBCCDD) usando cambios de bits.
La máscara indica cuántos bits del bit más significativo son fijos, lo que significa que 32 es un rango de IP único y 0 sería el rango de IP completo. Por lo tanto, podemos tomar una máscara con todos los bits configurados y desplazarla hacia la izquierda con 32-maskbits
para determinar la máscara real.
Si configuramos el maskbits
bits a cero, obtenemos el comienzo del rango, por lo que Y la IP con los bits de máscara. Si establecemos los bits en uno, obtenemos el final del rango, por lo que lo haremos con los bits de máscara negados.
Imprimir la dirección IP en formato CIDR es nuevamente simple: simplemente divida el valor de 32 bits en octetos y escríbalos separados por puntos.
using System;
namespace CSTests
{
class Program
{
static string toip(uint ip)
{
return String.Format("{0}.{1}.{2}.{3}", ip >> 24, (ip >> 16) & 0xff, (ip >> 8) & 0xff, ip & 0xff);
}
static void Main(string[] args)
{
string IP = "5.39.40.96/27";
string[] parts = IP.Split('.', "https://foroayuda.es/");
uint ipnum = (Convert.ToUInt32(parts[0]) << 24) |
(Convert.ToUInt32(parts[1]) << 16) |
(Convert.ToUInt32(parts[2]) << 8) |
Convert.ToUInt32(parts[3]);
int maskbits = Convert.ToInt32(parts[4]);
uint mask = 0xffffffff;
mask <<= (32 - maskbits);
uint ipstart = ipnum & mask;
uint ipend = ipnum | (mask ^ 0xffffffff);
Console.WriteLine(toip(ipstart) + " - " + toip(ipend));
}
}
}
Producción:
5.39.40.96 – 5.39.40.127