Golang實現IP地址匹配

實例: 給出一個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])
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章