Как вы анализируете строку IP-адреса в значение uint в C#?
Я пишу код C#, который использует Windows IP Helper API. Одна из функций, которую я пытаюсь вызвать, - это " GetBestInterface", который принимает представление "uint" IP. Что мне нужно, это проанализировать текстовое представление IP, чтобы создать представление "uint".
Я нашел несколько примеров через Google, например, этот или этот, но я уверен, что должен быть стандартный способ добиться этого с помощью.NET. Единственная проблема, я не могу найти этот стандартный путь. IPAddress.Parse, кажется, в правильном направлении, но он не предоставляет никакого способа получить представление "uint"...
Есть также способ сделать это, используя IP Helper, используя ParseNetworkString, но я бы предпочел использовать.NET - я считаю, что чем меньше я полагаюсь на pInvoke, тем лучше.
Итак, кто-нибудь знает стандартный способ сделать это в.NET?
8 ответов
MSDN говорит, что свойство IPAddress.Address (которое возвращает числовое представление IP-адреса) устарело, и вы должны использовать метод GetAddressBytes.
Вы можете преобразовать IP-адрес в числовое значение, используя следующий код:
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];
РЕДАКТИРОВАТЬ:
Как заметили другие комментаторы, вышеупомянутый код предназначен только для адресов IPv4. IPv6-адрес имеет длину 128 бит, поэтому невозможно преобразовать его в "uint", как этого хотел автор вопроса.
Не должно ли это быть:
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);`
Это решение легче читать, чем ручное переключение битов.
Правильное решение, соблюдающее порядок байтов:
var ipBytes = ip.GetAddressBytes();
ulong ip = 0;
if (BitConverter.IsLittleEndian)
{
ip = (uint) ipBytes[0] << 24;
ip += (uint) ipBytes[1] << 16;
ip += (uint) ipBytes[2] << 8;
ip += (uint) ipBytes[3];
}
else
{
ip = (uint)ipBytes [3] << 24;
ip += (uint)ipBytes [2] << 16;
ip += (uint)ipBytes [1] <<8;
ip += (uint)ipBytes [0];
}
Комплексное решение:
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();
}
Обратный порядок байтов:
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();
}
Вы можете проверить здесь:
https://www.browserling.com/tools/dec-to-ip
http://www.smartconversion.com/unit_conversion/IP_Address_Converter.aspx
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]);
Выход будет 192 168 1 1
Байтная арифметика не рекомендуется, так как она полагается на все 4-октетные IP-адреса.
Я никогда не нашел чистого решения (то есть: класс / метод в.NET Framework) для этой проблемы. Я думаю, что он просто недоступен, кроме предоставленных вами решений / примеров или примера Аку.:(