Учитывая IP-адрес и подсетевую маску, как я вычисляю CIDR?

Хорошо я, может казаться, не понимаю это: учитывая следующее:

IP address = 192.168.1.0
Subnetmask = 255.255.255.240

Используя c#, как я вычисляю нотацию CIDR 192.168.1.0/28 ? Существует ли простой способ достигнуть этого? Я пропускаю что-то?

Спасибо!

5
задан Jon Seigel 26 April 2010 в 23:00
поделиться

2 ответа

У меня нет этого кода на C #, но вот ответ на VB. Не должно быть слишком сложно преобразовать.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    Dim someIP As Net.IPAddress = Net.IPAddress.Parse("192.168.1.10")
    Dim someMASK As Net.IPAddress = Net.IPAddress.Parse("255.255.255.240")

    Dim ipL As Long = IPtoLong(someIP)
    Dim maskL As Long = IPtoLong(someMASK)

    'Convert  Mask to CIDR(1-30)
    Dim oneBit As Long = &H80000000L
    Dim CIDR As Integer = 0

    For x As Integer = 31 To 0 Step -1
        If (maskL And oneBit) = oneBit Then CIDR += 1 Else Exit For
        oneBit = oneBit >> 1
    Next

    Dim answer As String = LongToIp(ipL And maskL) & " /" & CIDR.ToString

End Sub

Public Function IPtoLong(ByVal theIP As Net.IPAddress) As Long 'convert IP to number

    Dim IPb() As Byte = theIP.GetAddressBytes 'get the octets
    Dim addr As Long 'accumulator for address

    For x As Integer = 0 To 3
        addr = addr Or (CLng(IPb(x)) << (3 - x) * 8)
    Next
    Return addr

End Function

Public Function LongToIp(ByVal theIP As Long) As String 'convert number back to IP

    Dim IPb(3) As Byte '4 octets
    Dim addr As String = "" 'accumulator for address

    Dim mask8 As Long = MaskFromCidr(8) 'create eight bit mask

    For x = 0 To 3 'get the octets
        IPb(x) = CByte((theIP And mask8) >> ((3 - x) * 8))
        mask8 = mask8 >> 8
        addr &= IPb(x).ToString & "." 'add current octet to string
    Next
    Return addr.TrimEnd("."c)

End Function

Private Function MaskFromCidr(ByVal CIDR As Integer) As Long
    MaskFromCidr = CLng(2 ^ ((32 - CIDR)) - 1) Xor 4294967295L
End Function
2
ответ дан 13 December 2019 в 19:24
поделиться

256 - 240 = 16 = 2 ** 4, 32 - 4 = 28

Это не совсем вопрос C #.

Чтобы получить сетевой адрес из IP-адреса и маски, вы можете побайтно применить и к IP-адресу и маске. Вы можете получить байты из строки, используя IPAddress.Parse () и IPAddress.GetAddressBytes () .

6
ответ дан 13 December 2019 в 19:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: