Я пытаюсь выполнить следующие действия в C#/.NET 2.0:Как использовать IPAddress и IPv4Mask для получения диапазона IP-адресов? .
Учитывая объект IPAddress (скажем, 192.168.127.100) и еще один объект, содержащий IP-адрес маски подсети IPv4Mask/(скажем, 255.255.248.0), Я должен уметь рассчитывать начало и конец диапазона IP-адресов.
(Да, я пытаюсь сделать для цикла через диапазон адресов в подсети.)
Теоретически, я должен быть в состоянии побитовое И на IPAddress и SubnetMask, чтобы получить IPStart , Затем я должен выполнить побитовое XOR на IPStart и инвертированную (NOT'd) SubnetMask, чтобы получить IPEnd.
Объект IPAddress предоставляет методы для вывода адреса как «long» или «byte []» (массив байтов).
Выполнение побитовой операции на длинном (поскольку оно подписано?) Приводит к недействительным результатам. И я не могу показаться, что выполнял побитовое управление в IPAddresses как массив байтов.
EDIT-1: Хорошо, зацикливание через каждый байт в массиве и выполнение побитового И, NOT и XOR (в каждой соответствующей ситуации) получает правильные результаты.
Следующая проблема, с которой я столкнулся, заключается в том, что я не могу выполнить for-loop легко после преобразования массивов byte [] в UInt32 или long. Итак, первое значение работает правильно, но приращение yint/long на один увеличивает IPaddress с 192.168.127.0 до 193.168.127.0. Кажется, что после того, как массив byte [] преобразуется в uint/long, порядок байты обращаются вспять. Таким образом, нет простого способа увеличения с IPStart до IPEnd.
У кого-нибудь есть предложения?
Там нет необходимости делать это на бит, операция поразрядного на один байт (т.е. 4 операции на пару IP/маска) достаточно –
Я не говорил, чтобы сделать это за бит, что потребует дополнительного шага разделения 4 байтов в массиве byte []. Может быть, я не был ясен, но я имел в виду, что для каждого байта в массиве вы выполняете побитную операцию по всему байту. – defines