Pregunta

Estoy escribiendo código C# que utiliza la API auxiliar de IP de Windows.Una de las funciones que intento llamar es "Obtener la mejor interfaz"Eso requiere una representación 'uint' 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 Éste o Éste, 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 manera de hacer esto usando IP Helper, usando el ParseNetworkString, pero nuevamente, prefiero usar .NET; creo que cuanto menos confíe en pInvoke, mejor.

Entonces, ¿alguien conoce una forma estándar de hacer esto en .NET?

¿Fue útil?

Solución

MSDN dice esa propiedad IPAddress.Address (que devuelve la representación numérica de la dirección IP) está obsoleta y debe usar Obtener direcciónBytes método.

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 notaron otros comentaristas, el código mencionado anteriormente es solo para direcciones IPv4.La dirección IPv6 tiene 128 bits, por lo que es imposible convertirla a 'uint' como quería el autor de la pregunta.

Otros consejos

¿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];

?

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 bits manual.

Ver ¿Cómo convertir una dirección IPv4 en un número entero en C#?

También debes recordar que IPv4 y IPv6 son de diferentes longitudes.

Se desaconseja la aritmética de bytes, ya que depende de que todas las IP sean de 4 octetos.

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 salida será 192 168 1 1

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 proporcionaste o el ejemplo de Aku.:(

Solución completa:

public static uint IpStringToUint(string ipString)
{
    var ipAddress = IPAddress.Parse(ipString);
    var ipBytes = ipAddress.GetAddressBytes();
    var ip = (uint)ipBytes [0] << 24;
    ip += (uint)ipBytes [1] << 16;
    ip += (uint)ipBytes [2] <<8;
    ip += (uint)ipBytes [3];
    return ip;
}

public static string IpUintToString(uint ipUint)
{
    var ipBytes = BitConverter.GetBytes(ipUint);
    var ipBytesRevert = new byte[4];
    ipBytesRevert[0] = ipBytes[3];
    ipBytesRevert[1] = ipBytes[2];
    ipBytesRevert[2] = ipBytes[1];
    ipBytesRevert[3] = ipBytes[0];
    return new IPAddress(ipBytesRevert).ToString();
}

Orden inverso de bytes:

public static uint IpStringToUint(string ipString)
{
    return BitConverter.ToUInt32(IPAddress.Parse(ipString).GetAddressBytes(), 0);
}

public static string IpUintToString(uint ipUint)
{
    return new IPAddress(BitConverter.GetBytes(ipUint)).ToString();
}

Puedes probar aquí:

https://www.browserling.com/tools/dec-to-ip

http://www.smartconversion.com/unit_conversion/IP_Address_Converter.aspx

http://www.silisoftware.com/tools/ipconverter.php

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top