主题:[原创]急!!!各位高手帮帮忙!!
huxinlu
[专家分:0] 发布于 2009-03-27 15:35:00
各位高手您们好:
小弟有个问题实在不能解决,想请您们帮帮忙。具体情况就是:想用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个回复)
沙发
老大徒伤悲 [专家分:29120] 发布于 2009-03-28 00:18:00
因为不知道你关于“汇总”的定义,但从你列出二进制来看似乎是哪位全为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的?
板凳
xjh22700 [专家分:320] 发布于 2009-03-28 18:00:00
楼主想说的是用VB做个程序模拟路由器的路由汇总功能是吧?
这个用C语言的位操作符可能比较容易些!~
3 楼
xjh22700 [专家分:320] 发布于 2009-03-28 19:59:00
'---今天周未有空,没事做就用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 楼
xjh22700 [专家分:320] 发布于 2009-03-30 23:27:00
呵呵,今天把上面的代码拿来再看看,发现上面的“提取”函数----即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))
取代就得了!~
其它地方应该还有可以再优化的!谁发现了就提出来啊,谢谢!
我来回复