Как разделить диапазон IP для маршрутизации полезной формы

#c# #ip

#c# #ip

Вопрос:

У меня есть файл данных IP, который содержит ряд данных диапазона IP. Я хочу разделить его на маршрутизацию полезной формы.
Используйте код C # для его анализа.

пример ввода

: 1.0.1.0 ~ 1.0.11.255
вывод

1.0.1.0255.255.255.0

1.0.2.0255.255.254.0

1.0.4.0255.255.252.0

1.0.10.0255.255.254.0


Обновленный вот мой код

 class Program
{
    const string datafile = @"....txt";

    static List<Pair> list = new List<Pair>();

    static void Main(string[] args)
    {

        using (StreamReader reader = new StreamReader(datafile))
        {
            int id = 0;
            while (!reader.EndOfStream)
            {
                try
                {
                    IPAddress f = IPAddress.None;
                    IPAddress e = IPAddress.None;
                    IPAddress ip = IPAddress.None;
                    IPAddress mask = IPAddress.None;

                    string[] ss = reader.ReadLine().Split('t');
                    f = IPAddress.Parse(ss[0]);
                    e = IPAddress.Parse(ss[1]);
                    Console.WriteLine("{0} {1}", f, e);

                    ip = f;

                    byte[] fb = f.GetAddressBytes();
                    byte[] eb = e.GetAddressBytes();
                    byte[] mb = new byte[fb.Length];

                    uint fi = 0, ei = 0, x, step = 1;
                    fi = ToUInt(fb);
                    ei = ToUInt(eb);
                    x = fi ^ ei;
                    while ((x amp; 1) == 1)
                    {
                        x >>= 1;
                        step <<= 1;
                    }
                    for (uint i = fi; i < ei; i  = step)
                    {
                        Pair pair = new Pair();
                        pair.IP = new IPAddress(ToBytes(i));
                        pair.Mask = new IPAddress(ToBytes(~(step - 1)));
                        Insert(pair);
                    }
                }
                catch { }
            }
        }
    }

    static uint ToUInt(byte[] bytes)
    {
        Contract.Requires(bytes.Length == 4);
        uint u = 0;
        for (int i = 0; i < 4; i  )
        {
            u <<= 8;
            u |= bytes[i];
        }
        return u;
    }

    static byte[] ToBytes(uint u)
    {
        byte[] bytes = new byte[4];
        for (int i = 3; i > -1; i--)
        {
            bytes[i] = (byte)(u amp; 0xff);
            u >>= 8;
        }
        return bytes;
    }

    static void Insert(Pair pair)
    {
        uint i = ToUInt(pair.IP.GetAddressBytes());
        uint m = ToUInt(pair.Mask.GetAddressBytes());
        uint x = m;
        uint d = 1;
        while ((x amp; 1) == 0)
        {
            d <<= 1;
            x >>= 1;
        }
        Pair pairPair = new Pair();
        pairPair.IP = new IPAddress(ToBytes(i ^ d));
        pairPair.Mask = pair.Mask;

        if (list.Contains(pairPair))
        {
            list.Remove(pairPair);
            Pair newPair = new Pair();
            newPair.Mask = new IPAddress(ToBytes(m << 1));
            newPair.IP = new IPAddress(ToBytes(i amp; ~d));
            Insert(newPair);
        }
        else
        {
            list.Add(pair);
        }
    }
}

class Pair
{
    public IPAddress IP { get; set; }
    public IPAddress Mask { get; set; }

    [DebuggerStepThrough]
    public override bool Equals(object obj)
    {
        Pair pair = obj as Pair;
        if (pair == null) return false;
        return pair.Mask.ToString() == this.Mask.ToString() amp;amp; pair.IP.ToString() == this.IP.ToString();
    }

    [DebuggerStepThrough]
    public override string ToString()
    {
        return string.Format("{0} {1}", IP, Mask);
    }
}
 

Комментарии:

1. @svick конечно, я пытался, но у меня нет идеального решения.

2. Use C# code to parse it Итак, вы хотите, чтобы мы написали ваш код за вас?

3. @L.B Извините, я пытался, но я не могу написать быстрый алгоритм для его анализа. итак, мне нужно описание этого алгоритма, но лучше всего иметь код.

4. Итак, вы смогли написать алгоритм, который слишком медленный для ваших нужд?

5. Я думаю, что это хорошая идея опубликовать ваш код.