Как вы анализируете строку 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);`

Это решение легче читать, чем ручное переключение битов.

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

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

Правильное решение, соблюдающее порядок байтов:

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

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

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) для этой проблемы. Я думаю, что он просто недоступен, кроме предоставленных вами решений / примеров или примера Аку.:(

Другие вопросы по тегам