Я был очень удивлен, когда я узнал, что я не могу просто сделать это:Выполнение операций битовые на IPAddress
Dim ip = IPAddress.Parse("192.168.1.3")
Dim mask = IPAddress.Parse("255.255.255.0")
' next lines won't compile
Dim networkAddress = ip And mask ' would produce 192.168.1.0
Dim broadcastAddress = ip Or (Not mask) ' would produce 192.168.1.255
Итак, прежде чем я пойти и реализовать этот тип функциональности сам по подклассу: я что-то отсутствует очевидно? Есть ли причина, почему это не было реализовано, что я пропускаю?
Я признаю, что, возможно, не уделял столько внимания во время моих сетевых занятий, как я, вероятно, должен был иметь.
EDIT
Я придумал этот блок кода:
Dim ip = IPAddress.Parse("192.168.1.3")
Dim mask = IPAddress.Parse("255.255.255.0")
Dim ipUnsignedInteger = BitConverter.ToUInt32(ip.GetAddressBytes, 0)
Dim maskUnsignedInteger = BitConverter.ToUInt32(mask.GetAddressBytes, 0)
Dim networkAddressUnsignedInteger = ipUnsignedInteger And maskUnsignedInteger
Dim networkAddress = New IPAddress(networkAddressUnsignedInteger)
Dim broadcastAddressUnsignedInteger = ipUnsignedInteger Or (Not maskUnsignedInteger)
Dim broadcastAddress = New IPAddress(broadcastAddressUnsignedInteger)
Это работает, но это невероятное количество дополнительного кода для чего-то, что кажется настолько очевидным для меня! Почему это не является частью рамки ?!
Попробуйте использовать функцию CLng, чтобы преобразовать ip в длинное целое число, а также маску в длинное целое число. Это, вероятно, поможет. – 2013-02-14 20:56:28
Спасибо! Я использовал целые числа без знака, поскольку ipv4 использует только 4 байта. Теперь мне просто нужен ответ на «почему». –
Вы пытаетесь использовать IP-адрес в качестве маски подсети? Я не думаю, что это обычная вещь (яблоки и апельсины), и это может быть причиной того, что она не является частью рамки. – kasperhj