tamaño - ¿Cómo se analiza una cadena de dirección IP a un valor de uint en C#?
long c# (7)
Estoy escribiendo el código C # que usa la API de Windows IP Helper. Una de las funciones que estoy tratando de llamar es " GetBestInterface " que toma una representación " incorrecta " de una IP. Lo que necesito es analizar una representación textual de la IP para crear la representación ''uint''.
He encontrado algunos ejemplos a través de Google, como este o este , pero estoy bastante seguro de que debería haber una forma estándar de lograr esto con .NET. El único problema es que no puedo encontrar esta forma estándar. IPAddress.Parse parece estar en la dirección correcta, pero no proporciona ninguna forma de obtener una representación ''uint'' ...
También hay una forma de hacerlo usando IP Helper, usando ParseNetworkString , pero de nuevo, prefiero usar .NET. Creo que cuanto menos confíe en pInvoke, mejor.
Entonces, ¿alguien sabe de una forma estándar de hacer esto en .NET?
MSDN dice que la propiedad IPAddress.Address (que devuelve la representación numérica de la dirección IP) está obsoleta y debe usar el método GetAddressBytes .
Puede convertir la dirección IP a un valor numérico usando el siguiente código:
var ipAddress = IPAddress.Parse("some.ip.address");
var ipBytes = ipAddress.GetAddressBytes();
var ip = (uint)ipBytes [3] << 24;
ip += (uint)ipBytes [2] << 16;
ip += (uint)ipBytes [1] <<8;
ip += (uint)ipBytes [0];
EDITAR:
Como otros comentadores notaron que el código mencionado anteriormente es solo para direcciones IPv4. La dirección IPv6 tiene 128 bits de longitud por lo que es imposible convertirla en ''uint'' como se quería el autor de la pregunta.
Nunca he encontrado una solución limpia (es decir, una clase / método en .NET Framework) para este problema. Supongo que simplemente no está disponible, excepto las soluciones / ejemplos que proporcionó o el ejemplo de Aku. :(
Se desaconseja la aritmética de bytes, ya que depende de que todas las direcciones IP sean de 4 octetos.
No debería ser:
var ipAddress = IPAddress.Parse("some.ip.address");
var ipBytes = ipAddress.GetAddressBytes();
var ip = (uint)ipBytes [0] << 24;
ip += (uint)ipBytes [1] << 16;
ip += (uint)ipBytes [2] <<8;
ip += (uint)ipBytes [3];
?
System.Net.IPAddress ipAddress = System.Net.IPAddress.Parse("192.168.1.1");
byte[] bytes = ipAddress.GetAddressBytes();
for (int i = 0; i < bytes.Length ; i++)
Console.WriteLine(bytes[i]);
La producción será 192 168 1 1
var ipuint32 = BitConverter.ToUInt32(IPAddress.Parse("some.ip.address.ipv4").GetAddressBytes(), 0);`
Esta solución es más fácil de leer que el cambio de bit manual.
Consulte ¿Cómo convertir una dirección IPv4 en un número entero en C #?