Domanda

Sto scrivendo codice C# che utilizza l'API Helper IP di Windows.Una delle funzioni che sto cercando di chiamare è "OttieniBestInterface" che accetta una rappresentazione 'uint' di un IP.Ciò di cui ho bisogno è analizzare una rappresentazione testuale dell'IP per creare la rappresentazione "uint".

Ho trovato alcuni esempi tramite Google, ad esempio Questo O Questo, ma sono abbastanza sicuro che dovrebbe esserci un modo standard per raggiungere questo obiettivo con .NET.L'unico problema è che non riesco a trovare questo modo standard.IPAddress.Parse sembra essere nella giusta direzione, ma non fornisce alcun modo per ottenere una rappresentazione 'uint'...

C'è anche un modo per farlo usando IP Helper, usando il file AnalizzaNetworkString, ma ancora una volta preferirei usare .NET: credo che meno mi affido a pInvoke, meglio è.

Quindi, qualcuno conosce un modo standard per farlo in .NET?

È stato utile?

Soluzione

MSDN dice quella proprietà IPAddress.Address (che restituisce la rappresentazione numerica dell'indirizzo IP) è obsoleta e dovresti usarla OttieniByteIndirizzo metodo.

È possibile convertire l'indirizzo IP in valore numerico utilizzando il seguente codice:

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

MODIFICARE:
Come altri commentatori hanno notato, il codice sopra menzionato è solo per gli indirizzi IPv4.L'indirizzo IPv6 è lungo 128 bit, quindi è impossibile convertirlo in "uint" come voleva l'autore della domanda.

Altri suggerimenti

Non dovrebbe essere:

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

Questa soluzione è più facile da leggere rispetto allo spostamento manuale dei bit.

Vedere Come convertire un indirizzo IPv4 in un numero intero in C#?

Inoltre dovresti ricordartelo IPv4 E IPv6 hanno lunghezze diverse.

L'aritmetica dei byte è sconsigliata, poiché si basa sul fatto che tutti gli IP siano di 4 ottetti.

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

L'output sarà 192 168 1 1

Non ho mai trovato una soluzione pulita (es .:una classe/metodo in .NET Framework) per questo problema.Immagino che semplicemente non sia disponibile tranne le soluzioni/esempi che hai fornito o l'esempio di Aku.:(

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

Ordine inverso dei byte:

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

Puoi provare qui:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top