Question

J'écris du code C# qui utilise l'API Windows IP Helper.L'une des fonctions que j'essaie d'appeler est "Obtenir la meilleure interface" qui prend une représentation 'uint' d'une adresse IP.Ce dont j'ai besoin, c'est d'analyser une représentation textuelle de l'IP pour créer la représentation « uint ».

J'ai trouvé quelques exemples via Google, comme celui-ci ou celui-ci, mais je suis presque sûr qu'il devrait exister un moyen standard d'y parvenir avec .NET.Le seul problème est que je ne trouve pas cette méthode standard.IPAddress.Parse semble aller dans la bonne direction, mais il ne fournit aucun moyen d'obtenir une représentation « uint »...

Il existe également un moyen de le faire en utilisant IP Helper, en utilisant le ParseNetworkString, mais encore une fois, je préfère utiliser .NET - je crois que moins je compte sur pInvoke, mieux c'est.

Alors, quelqu'un connaît une manière standard de procéder dans .NET ?

Était-ce utile?

La solution

MSDN dit cette propriété IPAddress.Address (qui renvoie une représentation numérique de l'adresse IP) est obsolète et vous devez utiliser GetAddressBytes méthode.

Vous pouvez convertir l'adresse IP en valeur numérique en utilisant le code suivant :

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

MODIFIER:
Comme d'autres commentateurs l'ont remarqué, le code mentionné ci-dessus concerne uniquement les adresses IPv4.L'adresse IPv6 fait 128 bits, il est donc impossible de la convertir en « uint » comme le souhaitait l'auteur de la question.

Autres conseils

Ne devrait-il pas être :

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);`

Cette solution est plus facile à lire que le décalage manuel des bits.

Voir Comment convertir une adresse IPv4 en entier en C# ?

Vous devez également vous rappeler que IPv4 et IPv6 sont de longueurs différentes.

L'arithmétique des octets est déconseillée, car elle repose sur le fait que toutes les adresses IP sont des adresses IP de 4 octets.

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 sortie sera 192 168 1 1

Je n'ai jamais trouvé de solution propre (c'est-à-dire :une classe/méthode dans le .NET Framework) pour ce problème.Je suppose que ce n'est tout simplement pas disponible, à l'exception des solutions/exemples que vous avez fournis ou de l'exemple d'Aku.:(

Solution complète :

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

Ordre inverse des octets :

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

Vous pouvez tester ici :

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top