Frage

Ich schreibe C#-Code, der die Windows IP Helper API verwendet.Eine der Funktionen, die ich aufrufen möchte, ist „GetBestInterface„das nimmt eine ‚uint‘-Darstellung einer IP an.Was ich brauche, ist, eine Textdarstellung der IP zu analysieren, um die „uint“-Darstellung zu erstellen.

Ich habe einige Beispiele über Google gefunden, z Dieses hier oder Dieses hier, aber ich bin mir ziemlich sicher, dass es einen Standardweg geben sollte, dies mit .NET zu erreichen.Das einzige Problem ist, dass ich diesen Standardweg nicht finden kann.IPAddress.Parse scheint in die richtige Richtung zu gehen, bietet aber keine Möglichkeit, eine „uint“-Darstellung zu erhalten ...

Es gibt auch eine Möglichkeit, dies mit IP Helper zu tun: mit ParseNetworkString, aber auch hier würde ich lieber .NET verwenden – ich glaube, je weniger ich mich auf pInvoke verlasse, desto besser.

Kennt jemand eine Standardmethode, dies in .NET zu tun?

War es hilfreich?

Lösung

MSDN sagt Diese IPAddress.Address-Eigenschaft (die eine numerische Darstellung der IP-Adresse zurückgibt) ist veraltet und sollte verwendet werden GetAddressBytes Methode.

Mit dem folgenden Code können Sie die IP-Adresse in einen numerischen Wert umwandeln:

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

BEARBEITEN:
Wie andere Kommentatoren bemerkt haben, gilt der oben genannte Code nur für IPv4-Adressen.Die IPv6-Adresse ist 128 Bit lang, daher ist es unmöglich, sie in „uint“ umzuwandeln, wie es der Autor der Frage wollte.

Andere Tipps

Sollte es nicht sein:

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

Diese Lösung ist einfacher zu lesen als die manuelle Bitverschiebung.

Sehen Wie konvertiere ich eine IPv4-Adresse in C# in eine Ganzzahl?

Auch das sollten Sie bedenken IPv4 Und IPv6 sind unterschiedlich lang.

Von der Byte-Arithmetik wird abgeraten, da sie darauf angewiesen ist, dass alle IPs 4-Oktett-IPs sind.

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

Die Ausgabe wird 192 168 1 1 sein

Ich habe noch nie eine saubere Lösung gefunden (d. h.:(eine Klasse/Methode im .NET Framework) für dieses Problem.Ich vermute, dass es außer den von Ihnen bereitgestellten Lösungen/Beispielen oder Akus Beispiel einfach nicht verfügbar ist.:(

Komplette Lösung:

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

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

Hier können Sie testen:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top