以IPv4地址为例,172.33.200.22
,分成四块,每块使用一个字节来存储,最终形成一个四字节的整醒数值。
func Ipv4ToLong(ip string) (uint, error) {
p := net.ParseIP(ip).To4()
if p == nil {
return 0, errors.New("invalid ipv4 format")
}
return uint(p[0])<<24 | uint(p[1])<<16 | uint(p[2])<<8 | uint(p[3]), nil
}
func LongToIpv4(i uint) (string, error) {
if i > math.MaxUint32 {
return "", errors.New("beyond the scope of ipv4")
}
ip := make(net.IP, net.IPv4len)
ip[0] = byte(i >> 24)
ip[1] = byte(i >> 16)
ip[2] = byte(i >> 8)
ip[3] = byte(i)
return ip.String(), nil
}
测试
fmt.Println(Ipv4ToLong("172.33.200.22")) // 2887895062
fmt.Println(LongToIpv4(2887895062)) // 172.33.200.22