Как вы преобразуете строку IP-адреса в значение uint в C #?

StackOverflow https://stackoverflow.com/questions/36831

Вопрос

Я пишу код на 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);`

Это решение легче читать, чем ручное смещение битов.

См. Как преобразовать адрес IPv4 в целое число в C #?

Также вы должны помнить, что IPv4 и IPv6 различной длины.

Байтная арифметика не рекомендуется, так как она основывается на том, что все 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

http://www.silisoftware.com/tools/ipconverter.php

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top