2014-11-05 4 views
0

Может ли кто-нибудь помочь мне с формулой для вычисления десятичного значения адреса IPv6?Получить десятичное значение адреса ipv6

Мне нужно поместить формулу в VBA, чтобы создать пользовательскую формулу excel. Я знаю формулу для IPv4, и я читал, что она похожа, но я не могу понять ее. Мне нужно это, чтобы иметь возможность отображать адрес IPv6 в диапазон в CSV ip2location.

+0

Ну, вы можете понять это из того факта, что адрес IPv6 составляет 8 значений 16 бит. Итак, вы работаете с полиномом с полномочиями 65536 (2^16). Это будет один большой номер. Если вам нужно больше, просто Google «IPv6 для десятичного преобразования». Много хитов. – lurker

+0

Это действительно так, как в случае с IPv4, но с IPv6 у вас есть полномочия 65536 вместо 255, и у вас есть 8 терминов вместо 4. – lurker

+0

Хорошо, но когда я использую калькулятор и сравниваю с ip2location csv, я получаю правильный результат. если я изменяю формулу ipv4 на 8 членов и умножаюсь по степеням 65536 вместо 256, я получаю совершенно другое число, чем то, что дает калькулятор или csv. поэтому я делаю ошибку где-то, но я не знаю, где .. –

ответ

0

У меня есть некоторые функции Excel IP, с которыми вы сможете начать.

=SubnetIPv4(IPv4,Bits,Offset)  =IsIPv4(IPv4) 
IP Address Bits Offset Result  Result 
10.11.12.13 26 0 10.11.12.0 TRUE 
Notes: 
Macros must be enabled 
IPv4 is a string representing an IPv4 address in dotted decimal format 
Bits is an integer (0 to 32) representing the number of mask bits 
Offset is an integer representing the host address offset into the subnet 
Using Offset 0 will retun a subnet for any IP address 
Using IPv4 of 255.255.255.255 and Offset 0 will retun a mask of Bits size 

=SubnetIPv6(IPv6,Bits,Offset)        =IsIPv6(IPv6) 
IP Address    Bits Offset Result     Result 
fe80::1dce:e8b3:1a14:2c3b 10 :: FE80:0:0:0:0:0:0:0  TRUE 
Notes: 
Macros must be enabled 
IPv6 is a string representing an IPv6 address in standard format (leading 0s are optional and :: works) 
Bits is an integer (0 to 128) representing the number of mask bits 
Offset is a string representing the host address offset into the subnet in standard format (leading 0s are optional and :: works) 
Using Offset equivalent to 0 (::, ::0, 0:0:0:0:0:0:0:0, etc.) will retun a subnet for any IP address 
Using IPv6 of FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF and Offset equivalent to 0 will retun a mask of Bits size 


Function CountStr(Source As String, Target As String) As Integer 
    Dim c, i As Integer 
    c = 0 
    If Not ((Source = "") Or (Target = "")) Then 
     For i = 1 To Len(Source) 
      If Mid(Source, i, Len(Target)) = Target Then 
       c = c + 1 
      End If 
     Next 
    End If 
    CountStr = c 
End Function 


Function SubnetIPv4(IPv4 As String, Bits As Integer, Offset As Long) As String 

    Dim a() As String 
    Dim c, d, i As Integer 
    Dim m As Long 
    Dim s As String 

    If IPv4 = "" Then 
     GoTo InvalidIPv4 
    End If 

    c = CountStr(IPv4, ".") 
    If c <> 3 Then 
     GoTo InvalidIPv4 
    End If 

    c = CountStr(IPv4, "..") 
    If c > 1 Then 
     GoTo InvalidIPv4 
    End If 

    If (Left(IPv4, 1) = ".") Or (Right(IPv4, 1) = ".") Then 
     GoTo InvalidIPv4 
    End If 

    a = Split(IPv4, ".") 
    If UBound(a) <> 3 Then 
     GoTo InvalidIPv4 
    End If 

    On Error GoTo InvalidIPv4 
    For i = 0 To 3 
     If (Len(a(i)) > 0) And (Len(a(i)) < 4) Then 
      a(i) = CInt(a(i)) 
      If (a(i) < 0) Or (a(i) > 255) Then 
       GoTo InvalidIPv4 
      End If 
     Else 
      GoTo InvalidIPv4 
     End If 
    Next 

    If (Bits < 0) Or (Bits > 32) Then 
     GoTo InvalidIPv4 
    End If 

    c = Bits Mod 8 
    d = Bits \ 8 
    If (Bits <> 0) And (c = 0) Then 
     c = 8 
     d = d - 1 
    End If 
    m = 0 
    For i = 0 To 7 
     m = m * 2 
     If c > 0 Then 
      m = m + 1 
      c = c - 1 
     End If 
    Next 
    a(d) = CStr(CLng(a(d)) And m) 
    For i = d + 1 To 3 
     a(i) = "0" 
    Next 

    If Offset < 0 Then 
     GoTo InvalidIPv4 
    End If 

    m = 0 
    For i = 1 To (32 - Bits) 
     m = m * 2 
     m = m + 1 
    Next 
    If Offset > m Then 
     GoTo InvalidIPv4 
    End If 

    m = Offset 
    For i = 3 To 0 Step -1 
     a(i) = a(i) + (m Mod 256) 
     m = m \ 256 
    Next 

    s = "" 
    For i = 0 To 3 
     s = s + CStr(a(i)) + "." 
    Next 
    s = Left(s, Len(s) - 1) 

    SubnetIPv4 = s 
    Exit Function 

InvalidIPv4: 
    Error (3) 

End Function 



Function IsIPv4(IPv4 As String) As Boolean 

    Dim s As String 

    On Error GoTo InvalidIPv4 
    s = SubnetIPv4(IPv4, 32, 0) 

    IsIPv4 = True 
    Exit Function 

InvalidIPv4: 
    IsIPv4 = False 

End Function 

Function SubnetIPv6(IPv6 As String, Bits As Integer, Offset As String) As String 

    Dim a() As String 
    Dim c, d, i As Integer 
    Dim m As Long 
    Dim s, t As String 

    If IPv6 = "" Then 
     GoTo InvalidIPv6 
    End If 

    c = CountStr(IPv6, ":") 
    If (c < 2) Or (c > 8) Then 
     GoTo InvalidIPv6 
    End If 

    d = CountStr(IPv6, "::") 
    If d > 1 Then 
     GoTo InvalidIPv6 
    End If 

    If (Left(IPv6, 1) = ":") And (Not (Left(IPv6, 2) = "::")) Then 
     GoTo InvalidIPv6 
    End If 

    If (Right(IPv6, 1) = ":") And (Not (Right(IPv6, 2) = "::")) Then 
     GoTo InvalidIPv6 
    End If 

    s = IPv6 
    If d = 1 Then 
     If Left(s, 2) = "::" Then 
      s = "0" + s 
     End If 
     If Right(s, 2) = "::" Then 
      s = s + "0" 
     End If 
     t = ":" 
     For i = c To 7 
      t = t + "0:" 
     Next 
     s = Replace(s, "::", t) 
    End If 

    a = Split(s, ":") 
    If UBound(a) <> 7 Then 
     GoTo InvalidIPv6 
    End If 

    On Error GoTo InvalidIPv6 
    For i = 0 To 7 
     If (Len(a(i)) > 0) And (Len(a(i)) < 5) Then 
      a(i) = WorksheetFunction.Hex2Dec(a(i)) 
     Else 
      GoTo InvalidIPv6 
     End If 
    Next 

    If (Bits < 0) Or (Bits > 128) Then 
     GoTo InvalidIPv6 
    End If 

    c = Bits Mod 16 
    d = Bits \ 16 
    If (Bits <> 0) And (c = 0) Then 
     c = 16 
     d = d - 1 
    End If 
    m = 0 
    For i = 0 To 15 
     m = m * 2 
     If c > 0 Then 
      m = m + 1 
      c = c - 1 
     End If 
    Next 
    a(d) = CStr(CLng(a(d)) And m) 
    For i = d + 1 To 7 
     a(i) = "0" 
    Next 

    If Offset = "" Then 
     GoTo InvalidIPv6 
    End If 

    c = CountStr(Offset, ":") 
    If (c < 2) Or (c > 8) Then 
     GoTo InvalidIPv6 
    End If 

    d = CountStr(Offset, "::") 
    If d > 1 Then 
     GoTo InvalidIPv6 
    End If 

    If (Left(Offset, 1) = ":") And (Not (Left(Offset, 2) = "::")) Then 
     GoTo InvalidIPv6 
    End If 

    If (Right(Offset, 1) = ":") And (Not (Right(Offset, 2) = "::")) Then 
     GoTo InvalidIPv6 
    End If 

    s = Offset 
    If d = 1 Then 
     If Left(s, 2) = "::" Then 
      s = "0" + s 
     End If 
     If Right(s, 2) = "::" Then 
      s = s + "0" 
     End If 
     t = ":" 
     For i = c To 7 
      t = t + "0:" 
     Next 
     s = Replace(s, "::", t) 
    End If 

    b = Split(s, ":") 
    If UBound(b) <> 7 Then 
     GoTo InvalidIPv6 
    End If 

    On Error GoTo InvalidIPv6 
    For i = 0 To 7 
     If (Len(b(i)) > 0) And (Len(b(i)) < 5) Then 
      b(i) = WorksheetFunction.Hex2Dec(b(i)) 
     Else 
      GoTo InvalidIPv6 
     End If 
    Next 

    c = Bits Mod 16 
    d = Bits \ 16 
    If (Bits <> 0) And (c = 0) Then 
     c = 16 
     d = d - 1 
    End If 
    m = 0 
    For i = 0 To 15 
     m = m * 2 
     If c > 0 Then 
      m = m + 1 
      c = c - 1 
     End If 
    Next 

    For i = 0 To d - 1 
     If b(i) <> "0" Then 
      GoTo InvalidIPv6 
     End If 
    Next 
    If b(d) <> CStr(CLng(b(d)) And m) Then 
     GoTo InvalidIPv6 
    End If 

    For i = 7 To d Step -1 
     a(i) = CStr(CLng(a(i)) + CLng(b(i))) 
    Next 

    s = "" 
    For i = 0 To 7 
     s = s + WorksheetFunction.Dec2Hex(a(i)) + ":" 
    Next 
    s = Left(s, Len(s) - 1) 

    SubnetIPv6 = s 
    Exit Function 

InvalidIPv6: 
    Error (3) 

End Function 



Function IsIPv6(IPv6 As String) As Boolean 

    Dim s As String 

    On Error GoTo InvalidIPv6 
    s = SubnetIPv6(IPv6, 128, "::") 

    IsIPv6 = True 
    Exit Function 

InvalidIPv6: 
    IsIPv6 = False 

End Function 
+0

Вы не объяснили, что делают эти функции и как оно решает проблему OP представления строки IPv6 как десятичного значения. – lurker

+0

Я не знаю, что я могу объяснить. Эти функции - то, как я их получил. OP выразила желание создать пользовательскую формулу Excel. Для IPv4 и IPv6 существует 2 функции для проверки и расчета адресов. Я нашел их полезными, и OP может что-то сделать с кодом. –

+0

Я не могу все объяснить. Я добавил что-то, что показывает, что я понял, как использовать их. –

0

Десятичное значение адреса IPv6 будет большим. Вам понадобится 128-битное целое число без знака, но такого типа данных в VBA нет. Насколько я знаю, вы не можете манипулировать адресами IPv6 как целые числа.

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