回 帖 发 新 帖 刷新版面

主题:[原创]急!!!各位高手帮帮忙!!

各位高手您们好: 
    小弟有个问题实在不能解决,想请您们帮帮忙。具体情况就是:想用VB做一个小工具,将随意输入的3个ip地址通过运算汇总成一个。大概意思入下:

把这几个网络地址展开为2进制的,然后看相同的网络位,连续而且相同的网络位就是这几个网络地址的汇总地址了,例如:
172.168.4.1/24
172.168.5.1/24
172.168.6.1/24
172.168.7.1/24
这几个地址展开来是:
10101100.10101000.00000100.00000001
10101100.10101000.00000101.00000001
10101100.10101000.00000110.00000001
10101100.10101000.00000111.00000001
他们都有相同的前22位,所以汇总地址就是172.168.4.0/22

回复列表 (共4个回复)

沙发

因为不知道你关于“汇总”的定义,但从你列出二进制来看似乎是哪位全为1,就保留为1,否则为0————这是典型的and运算。
这样汇总的结果是:
172.168.4.1/24
172.168.5.1/24
172.168.6.1/24
172.168.7.1/24
--------------------
172.168.4.1/24
与你的172.168.4.0/22不同。不知道你4个1如何汇总成0,4个24如何汇总成22的?

板凳

楼主想说的是用VB做个程序模拟路由器的路由汇总功能是吧?

这个用C语言的位操作符可能比较容易些!~

3 楼

'---今天周未有空,没事做就用VB实现写了个程序,楼主看看是不是你想要的!~
'---剩下的你自已再完善一下吧,在文本框输入IP时一定要符合IP地址的格式啊,要不然我不知道会出什么错喽!~
'---在窗体上画一个命令按钮,两个文本框,粘贴下面的代码

Private Sub Form_Load()
Text1.Text = "192.168.4.1"
Text2.Text = "192.168.5.1"
End Sub

'比较a、b两数的二进制形式在第几位开始不同,变量j返回此位置。
'函数的返回值实际是一个掩码,a、b二进位不同的地方和后面各位都为置‘0’就是函数的返回值了
Private Function f(ByVal a As Integer, ByVal b As Integer, j As Integer) As Integer
Dim n As Integer
Dim i As Integer
Dim mask As Integer

n = a Xor b
For i = 8 To 0 Step -1
    If n < 2 ^ i Then
        mask = 256 - 2 ^ i
        j = i
    End If
Next i
j = 8 - j
f = mask
End Function
'提取IP地址的第n个字节的值
Private Function tc(ByVal IP As String, ByVal n As Integer) As Integer
    Dim i As Integer
    Dim Lt As Integer
    Dim ipNum As String
    IP = "." & IP
    Lt = 0
    For i = 1 To Len(IP)
        If Mid(IP, i, 1) = "." Then
            Lt = Lt + 1
            If Lt = n Then
                ipNum = Mid(IP, i + 1, 3)
            End If
        End If
    Next i
    For i = 1 To 3
        If Mid(ipNum, i, 1) = "." Then
            ipNum = Mid(ipNum, 1, i - 1)
        End If
    Next i
    tc = CInt(ipNum)
End Function

Private Sub Command1_Click()
Dim a(1 To 4) As Integer  '保存第一个IP地址的各个字节的值
Dim b(1 To 4) As Integer  '保存第二个IP地址的各个字节的值
Dim c(1 To 4) As Integer  '保存运算后IP地址的各个字节的值
Dim j(1 To 4) As Integer  '保存……不知如何说
Dim i As Integer
Dim IP As String  '运算后的IP网络地址,是通过连接数组C得到

For i = 1 To 4
    a(i) = tc(Text1.Text, i)
    b(i) = tc(Text2.Text, i)
Next i

For i = 1 To 4
    c(i) = a(i) And f(a(i), b(i), j(i))
    If j(i) <> 8 Then Exit For
Next i

IP = ""
For i = 1 To 4
    If i = 4 Then
        IP = IP & Trim(Str(c(i)))
    Else
        IP = IP & Trim(Str(c(i))) & "."
    End If
Next i
MsgBox "汇总结果:" & IP & "  /" & Trim(Str(j(1) + j(2) + j(3) + j(4)))
End Sub

4 楼

呵呵,今天把上面的代码拿来再看看,发现上面的“提取”函数----即tc函数的最后几行代码其实可以再优化一些!
'-----------------------------------------
    For i = 1 To 3
        If Mid(ipNum, i, 1) = "." Then
            ipNum = Mid(ipNum, 1, i - 1)
        End If
    Next i
    tc = CInt(ipNum)
'-----------------------------------------
这几行可以化为一行,即用一句:
    tc = CInt(Val(ipNum))
取代就得了!~
其它地方应该还有可以再优化的!谁发现了就提出来啊,谢谢!

我来回复

您尚未登录,请登录后再回复。点此登录或注册