實例: 給出一個IP地址和一個地址段,確認該IP地址是否屬於這個地址段。
分析:IP地址 = 網絡號 + 主機號
鑑定IP地址是否屬於該地址段,只需鑑定兩者的網絡號是否相等。
例子: IP 192.168.56.2 IP地址段: 192.168.56.0/26
IP地址 | 二進制表示 |
---|---|
192.168.56.2 | 11000000 10101000 00111000 00000010 |
192.168.56.0/26 | 11000000 10101000 00111000 00000000 |
已知子網掩碼爲26位
將IP地址右移6(32-26)位,再進行異或運算
11000000 10101000 00111000 00 ⊕ 11000000 10101000 00111000 00
如果結果爲0, 則表示網絡號一致,則該IP屬於該網段。
如果結果爲1, 則表示網絡號不一致, 則表示該IP不屬於該網段。
//將IP地址轉化爲二進制String
func ip2binary(ip string) string {
str := strings.Split(ip, ".")
var ipstr string
for _, s := range str {
i, err := strconv.ParseUint(s, 10, 8)
if err != nil {
fmt.Println(err)
}
ipstr = ipstr + fmt.Sprintf("%08b", i)
}
return ipstr
}
匹配代碼,實際代碼中沒有做異或運算,直接比較兩個字符串的前n(子網掩碼長度)位是否相等
#測試IP地址和地址端是否匹配 變量ip爲字符串,例子"192.168.56.4" iprange爲地址端"192.168.56.64/26"
func match(ip, iprange string) bool {
ipb := ip2binary(ip)
ipr := strings.Split(iprange, "/")
masklen, err := strconv.ParseUint(ipr[1], 10, 32)
if err != nil {
fmt.Println(err)
return false
}
iprb := ip2binary(ipr[0])
return strings.EqualFold(ipb[0:masklen], iprb[0:masklen])
}