Лучший подход для получения последнего октета ipv4 - PullRequest
5 голосов
/ 03 августа 2011

Я знаю, что подстрока может справиться с этим, но есть ли лучший способ получить последний октет от IP?

Пример: 192.168.1.100

Я хочу 100

Tks

Ответы [ 4 ]

18 голосов
/ 03 августа 2011

просто для удовольствия:

Console.WriteLine(IPAddress.Parse("192.168.1.33").GetAddressBytes()[3]);
1 голос
/ 03 августа 2011

Просто для удовольствия я написал версию, которая будет иметь наименьшие издержки (манипуляции со строками и т. Д.). @ rushui имеет правильный ответ.

static void Main(string[] args)
{
    Console.WriteLine(OctetInIP("10.1.1.100", 0));
    Console.ReadLine();
}

static byte OctetInIP(string ip, int octet)
{
    var octCount = 0;
    var result = 0;

    // Loop through each character.
    for (var i = 0; i < ip.Length; i++)
    {
        var c = ip[i];

        // If we hit a full stop.
        if (c == '.')
        {
            // Return the value if we are on the correct octet.
            if (octCount == octet)
                return (byte)result;
            octCount++;
        }
        else if (octCount == octet)
        {
            // Convert the current octet to a number.
            result *= 10;
            switch (c)
            {
                case '0': break;
                case '1': result += 1; break;
                case '2': result += 2; break;
                case '3': result += 3; break;
                case '4': result += 4; break;
                case '5': result += 5; break;
                case '6': result += 6; break;
                case '7': result += 7; break;
                case '8': result += 8; break;
                case '9': result += 9; break;
                default:
                    throw new FormatException();
            }

            if (result > 255)
                throw new FormatException();
        }
    }

    if (octCount != octet)
        throw new FormatException();

    return (byte)result;
}
0 голосов
/ 03 августа 2011

Помните, что такое IP-адрес, это 32-битное (4 байта) число.Поэтому маскировка адреса маской подсети будет правильным способом сделать это.Если вы всегда хотите, чтобы маска подсети 255.255.255.0, как следует из вашего вопроса, вы можете & число с 0xFF, чтобы получить число.

Но, если вы не заботитесь об эффективности и имеете толькоадрес в виде строки, разделение на "."это просто хорошо ...:)

0 голосов
/ 03 августа 2011

Это может быть излишним, но простое регулярное выражение также поможет:

(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})
...