Como você analisa uma string de endereço IP para um valor uint em C#?
-
09-06-2019 - |
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?
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#?
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