Как преобразовать адрес IPv4 в целое число в C #? - PullRequest
94 голосов
/ 20 января 2009

Я ищу функцию, которая преобразует стандартный адрес IPv4 в целое число. Бонусные баллы доступны для функции, которая будет делать обратное.

Решение должно быть в C #.

Ответы [ 21 ]

1 голос
/ 18 января 2013

С UInt32 в правильном формате с прямым порядком байтов, вот две простые функции преобразования:

public uint GetIpAsUInt32(string ipString)
{
    IPAddress address = IPAddress.Parse(ipString);

    byte[] ipBytes = address.GetAddressBytes();

    Array.Reverse(ipBytes);

    return BitConverter.ToUInt32(ipBytes, 0);
}

public string GetIpAsString(uint ipVal)
{
    byte[] ipBytes = BitConverter.GetBytes(ipVal);

    Array.Reverse(ipBytes);

    return new IPAddress(ipBytes).ToString();
}
1 голос
/ 20 января 2009

Если вас заинтересовала функция, ответ на этот вопрос приведен не так:

int ipToInt(int first, int second, 
    int third, int fourth)
{
    return Convert.ToInt32((first * Math.Pow(256, 3))
        + (second * Math.Pow(256, 2)) + (third * 256) + fourth);
}

, где first - fourth - сегменты адреса IPv4.

1 голос
/ 30 мая 2013
public bool TryParseIPv4Address(string value, out uint result)
{
    IPAddress ipAddress;

    if (!IPAddress.TryParse(value, out ipAddress) ||
        (ipAddress.AddressFamily != System.Net.Sockets.AddressFamily.InterNetwork))
    {
        result = 0;
        return false;
    }

    result = BitConverter.ToUInt32(ipAddress.GetAddressBytes().Reverse().ToArray(), 0);
    return true;
}
0 голосов
/ 26 августа 2015
var ipAddress = "10.101.5.56";

var longAddress = long.Parse(string.Join("", ipAddress.Split('.').Select(x => x.PadLeft(3, '0'))));

Console.WriteLine(longAddress);

Выход: 10101005056

0 голосов
/ 06 июня 2014

Предполагается, что у вас есть IP-адрес в строковом формате (например, 254.254.254.254)

string[] vals = inVal.Split('.');
uint output = 0;
for (byte i = 0; i < vals.Length; i++) output += (uint)(byte.Parse(vals[i]) << 8 * (vals.GetUpperBound(0) - i));
0 голосов
/ 16 марта 2011

@ Дейви Ладман, ваше решение со сдвигом корректно, но только для ip, начинающегося с номера, меньшего или равного 99, первый октет должен быть наложен на длинный.

В любом случае конвертировать обратно с длинным типом довольно сложно, потому что хранить 64 бита (не 32 для Ip) и заполнять 4 байта нулями

static uint ToInt(string addr)
{
   return BitConverter.ToUInt32(IPAddress.Parse(addr).GetAddressBytes(), 0);
}

static string ToAddr(uint address)
{
    return new IPAddress(address).ToString();
}

Наслаждайтесь!

Massimo

0 голосов
/ 06 июня 2009

Я думаю, что это неправильно: "65536" ==> 0.0.255.255 " Должно быть: "65535" ==> 0.0.255.255 "или" 65536 "==> 0.1.0.0"

0 голосов
/ 06 мая 2009

вот решение, которое я разработал сегодня (надо было сначала погуглить!):

    private static string IpToDecimal2(string ipAddress)
    {
        // need a shift counter
        int shift = 3;

        // loop through the octets and compute the decimal version
        var octets = ipAddress.Split('.').Select(p => long.Parse(p));
        return octets.Aggregate(0L, (total, octet) => (total + (octet << (shift-- * 8)))).ToString();
    }

Я использую LINQ, лямбду и некоторые расширения для дженериков, поэтому, хотя он дает тот же результат, он использует некоторые новые функции языка, и вы можете сделать это в трех строках кода.

У меня есть объяснение в моем блоге, если вам интересно.

ура, -jc

0 голосов
/ 16 марта 2016
var address = IPAddress.Parse("10.0.11.174").GetAddressBytes();
long m_Address = ((address[3] << 24 | address[2] << 16 | address[1] << 8 | address[0]) & 0x0FFFFFFFF);
0 голосов
/ 15 февраля 2019

Я заметил, что System.Net.IPAddress имеет свойство Address (System.Int64) и конструктор, которые также принимают тип данных Int64. Таким образом, вы можете использовать это для преобразования IP-адреса в / из числового (хотя не Int32, но Int64) формата.

...