2013-02-14 3 views
1

Я был очень удивлен, когда я узнал, что я не могу просто сделать это:Выполнение операций битовые на 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) 

Это работает, но это невероятное количество дополнительного кода для чего-то, что кажется настолько очевидным для меня! Почему это не является частью рамки ?!

+0

Попробуйте использовать функцию CLng, чтобы преобразовать ip в длинное целое число, а также маску в длинное целое число. Это, вероятно, поможет. – 2013-02-14 20:56:28

+0

Спасибо! Я использовал целые числа без знака, поскольку ipv4 использует только 4 байта. Теперь мне просто нужен ответ на «почему». –

+0

Вы пытаетесь использовать IP-адрес в качестве маски подсети? Я не думаю, что это обычная вещь (яблоки и апельсины), и это может быть причиной того, что она не является частью рамки. – kasperhj

ответ

0
Dim networkaddress2 As New IPAddress(ip.Address And mask.Address) 
Dim broadcastAddress2 = New IPAddress(CUInt(ip.Address) Or (Not CUInt(mask.Address))) 

Следует помнить, что IPAddress.Address не рекомендуется.

+0

Приятная находка! Я уже создал свою собственную реализацию, которая использует 'GetAddressBytes', но это в значительной степени то, что я искал. –

Смежные вопросы