Pergunta

Estou escrevendo código C# que usa a API Windows IP Helper.Uma das funções que estou tentando chamar é "Obtenha a melhor interface" que usa uma representação 'uint' de um IP.O que preciso é analisar uma representação textual do IP para criar a representação ‘uint’.

Encontrei alguns exemplos no Google, como Este ou Este, mas tenho certeza de que deveria haver uma maneira padrão de conseguir isso com o .NET.O único problema é que não consigo encontrar esse caminho padrão.IPAddress.Parse parece estar na direção certa, mas não fornece nenhuma maneira de obter uma representação 'uint'...

Também existe uma maneira de fazer isso usando o IP Helper, usando o ParseNetworkString, mas, novamente, prefiro usar o .NET - acredito que quanto menos confiar no pInvoke, melhor.

Então, alguém conhece uma maneira padrão de fazer isso no .NET?

Foi útil?

Solução

MSDN diz que a propriedade IPAddress.Address (que retorna a representação numérica do endereço IP) é obsoleta e você deve usar ObterAddressBytes método.

Você pode converter o endereço IP em valor numérico usando o seguinte 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 outros comentaristas notaram, o código mencionado acima é apenas para endereços IPv4.O endereço IPv6 tem 128 bits, portanto é impossível convertê-lo para 'uint' como o autor da pergunta queria.

Outras dicas

Não deveria 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 solução é mais fácil de ler do que a mudança manual de bits.

Ver Como converter um endereço IPv4 em um número inteiro em C#?

Além disso, você deve se lembrar disso IPv4 e IPv6 são comprimentos diferentes.

A aritmética de bytes é desencorajada, pois depende de todos os IPs serem 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]);

A saída será 192 168 1 1

Nunca encontrei uma solução limpa (ou seja:uma classe/método no .NET Framework) para este problema.Acho que simplesmente não está disponível, exceto as soluções/exemplos que você forneceu ou o exemplo de Aku.:(

Solução 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();
}

Ordem inversa 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();
}

Você pode testar aqui:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top