Как вы анализируете строку IP-адреса в значение uint в C #? - PullRequest
6 голосов
/ 31 августа 2008

Я пишу код на C #, который использует Windows Helper API. Одной из функций, которые я пытаюсь вызвать, является « GetBestInterface », которая принимает представление «uint» IP. Что мне нужно, это проанализировать текстовое представление IP для создания представления «uint».

Я нашел несколько примеров через Google, например , этот или , этот , но я почти уверен, что должен быть стандартный способ добиться этого с помощью .NET. Единственная проблема, я не могу найти этот стандартный путь. IPAddress.Parse, кажется, в правильном направлении, но он не предоставляет никакого способа получить представление «uint» ...

Существует также способ сделать это с помощью IP Helper, используя ParseNetworkString , но я бы предпочел использовать .NET - я считаю, что чем меньше я полагаюсь на pInvoke, тем лучше.

Итак, кто-нибудь знает стандартный способ сделать это в .NET?

Ответы [ 8 ]

16 голосов
/ 16 февраля 2009

Не должно ли быть:

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

11 голосов
/ 31 августа 2008

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

EDIT:
Как заметили другие комментаторы, вышеупомянутый код предназначен только для адресов IPv4. IPv6-адрес имеет длину 128 бит, поэтому его невозможно преобразовать в «uint», как этого хотел автор вопроса.

10 голосов
/ 01 сентября 2008
var ipuint32 = BitConverter.ToUInt32(IPAddress.Parse("some.ip.address.ipv4").GetAddressBytes(), 0);`

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

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

5 голосов
/ 31 августа 2008

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

1 голос
/ 10 октября 2010
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

1 голос
/ 31 августа 2008

Байтная арифметика не рекомендуется, поскольку она полагается на то, что все IP-адреса являются 4-октетными.

0 голосов
/ 05 мая 2018

Полное решение:

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

0 голосов
/ 31 августа 2008

Я никогда не находил чистого решения (например, класс / метод в .NET Framework) для этой проблемы. Я думаю, что он просто недоступен, кроме предоставленных вами решений / примеров или примера Аку. (

...