Как вы преобразуете строку IP-адреса в значение uint в C #?
-
09-06-2019 - |
Вопрос
Я пишу код на C #, который использует Windows IP Helper API.Одна из функций, которые я пытаюсь вызвать, это "GetBestИнтерфейс" для этого требуется "uint" представление IP-адреса.Что мне нужно, так это проанализировать текстовое представление IP-адреса, чтобы создать представление 'uint'.
Я нашел несколько примеров через Google, например этот или этот, но я почти уверен, что должен быть стандартный способ добиться этого с помощью .NET.Единственная проблема в том, что я не могу найти этот стандартный способ.IPAddress.Анализ, похоже, идет в правильном направлении, но он не предоставляет никакого способа получения представления 'uint'...
Существует также способ сделать это с помощью IP Helper, используя ParseNetworkString Строка синтаксического анализа, но опять же, я бы предпочел использовать .NET - я считаю, что чем меньше я полагаюсь на PInvoke, тем лучше.
Итак, кто-нибудь знает о стандартном способе сделать это в .NET?
Решение
MSDN говорит это свойство IPAddress.Address (которое возвращает числовое представление IP-адреса) устарело, и вам следует использовать Получить адрес в байтах способ.
Вы можете преобразовать 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);`
Это решение легче читать, чем ручное смещение битов.
Байтная арифметика не рекомендуется, так как она основывается на том, что все IP-адреса являются 4-октетными.
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 р>
Я никогда не находил чистого решения (например, класс / метод в .NET Framework) для этой проблемы. Я думаю, что он просто недоступен, кроме предоставленных вами решений / примеров или примера Аку. : (Р>
Полное решение:
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 р>