Живые и Твёрдые Издательский Дом Коммерсантъ

Получение диапазона IP адресов

Допустим, что диапазон IP адресов задаётся в виде 200.116.128/17, а вам надо из него получить диапазон IP адресов в виде строки: НачальныйАдресДиапазона - КонечныйАдресДиапазона
Пример программы

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ip_ca
{
    class Program
    {
        static void Main(string[] args)
        {
            iputils ip = new iputils("200.116.128/17");
            System.Console.WriteLine( ip.getIPArea() );
            System.Console.ReadLine();
        }
    }
}
Результат:

200.116.128.0-200.116.255.255

Все работа выполняется в классе iputils. Ниже дана его реализация.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ip_ca
{
    class iputils
    {
        public string ipstr;
        public string ipmin;
        public string ipmax;
        public int ipvlen = 32;
        // DecimalValues = dv
        private byte[] dv = { 128, 64, 32, 16, 8, 4, 2, 1 };
      
        public iputils(string ip)
        {
            ipstr = ip;
            ipmin = ""; ipmax = "";
            calculate();
        }

        private void calculate()
        {
            string strbinip = "", bstr_min = "", bstr_max = "";
            string[] ip_arr = ipstr.Split('/');
            string ip = ip_arr[0];
            int m = (ip_arr.Length == 2) ? Convert.ToInt32( ip_arr[1] ) : 0;
            string[] ip_part = ip.Split('.');
            foreach (string part in ip_part)
            {
                strbinip += ByteToBinaryString(Convert.ToByte(part));
            }
            while ( strbinip.Length < ipvlen ) strbinip += "0";
            bstr_min = (m > 0) ? strbinip.Substring(0, m) : strbinip;
            while ( bstr_min.Length < ipvlen ) bstr_min += "0";
            bstr_max = (m > 0) ? strbinip.Substring(0, m) : strbinip;
            while ( bstr_max.Length < ipvlen ) bstr_max += "1";

            // минимальный адрес диапазона
            ipmin = BinaryStringToIP(bstr_min);
            // максимальный адрес диапазона
            ipmax = BinaryStringToIP(bstr_max);
        }
        // преобразование двоичной строки в IP адрес
        string BinaryStringToIP(string bstr)
        {
            string rc = "";
            string[] sip = { "","","",""};
            if (bstr.Length == ipvlen)
            {
                for (int i = 0, j = 0; i < ipvlen; i += 8)
                {
                    sip[j++] = Convert.ToString( BinaryStringToByte(bstr.Substring(i, 8)) );
                }
            }
            rc = String.Join(".", sip);
            return rc;
        }
        // преобразование байта в двоичную строку
        string ByteToBinaryString(byte ipi)
        {
            string rc = "";
            ipi = Convert.ToByte(ipi);
            for (int i = 0; i < dv.Length; i++)
            {
                if (ipi >= dv[i])
                {
                    rc += "1";
                    ipi -= dv[i];
                }
                else
                {
                    rc += "0";
                }
            }
            return rc;
        }
        // преобразование двоичной строки в байт
        // строка состоит из 0 и 1
        // напомним, что в байте 8 бит
        byte BinaryStringToByte(string eight)
        {
            byte rc = 0; // return code // возвращаемое значение
            // дополняем переменную eight ноликами до размера 8 символов
            // нолики вставляем слева!
            while (eight.Length < 8) eight.Insert(0, "0");
            // проходим по символам переменной eight
            // для каждого символа eight[i] равного 1
            // берём значение из массива dv[i] и суммируем его в переменную rc.
            for (int i = 0; i < dv.Length; i++)
            {
                if (eight[i] == '1')
                {
                    rc += dv[i];
                }
            }
            return rc;
        }
        public string getMaxIP()
        {
            return ipmax;
        }
        public string getMinIP()
        {
            return ipmin;
        }
        public string getIPArea()
        {
            return ipmin + "-" + ipmax;
        }
    }
}
Рейтинг@Mail.ru Photo & Фото