IP 地点库中 IP 地点的生涯名目一样平常有两种,一种是点分十进制情势(192.168.1.1),另一种是数字情势(3232235777),,应用中,常常必要在这两种名目之间做转换。

针对这一个题目我在 exnet 扩展包内里实现可两者的转换的快捷要领:
- func IP2Long(ip net.IP) (uint, error) IP2Long 把 net.IP 转为数值
- func Long2IP(i uint) (net.IP, error) Long2IP 把数值转为 net.IP
- func IPString2Long(ip string) (uint, error) IPString2Long 把 ip 字符串转为数值
- func Long2IPString(i uint) (string, error) Long2IPString 把数值转为 ip 字符串
行使示例:
- package main
-
- import (
- "fmt"
- "net"
- "reflect"
-
- "github.com/thinkeridea/go-extend/exnet"
- )
-
- func main() {
- ip := "192.168.1.1"
-
- n, _ := exnet.IPString2Long(ip)
- s, _ := exnet.Long2IPString(n)
-
- fmt.Println(n, s == ip)
-
- Ip1 := net.ParseIP(ip) // 会获得一个16字节的byte,首要为了兼容ipv6
- n, _ = exnet.IP2Long(Ip1)
-
- Ip2, _ := exnet.Long2IP(n)
-
- fmt.Println(n, reflect.DeepEqual(Ip1[12:], Ip2))
- }
那么是怎样将点分十进制的IP地点转为数字?
IPv4 地点有4个字节,样式如下:
每个字节暗示的范畴:
- byte4: 4294967296(1<<32)
- byte3: 16777216(1<<24)
- byte2: 65536(1<<16)
- byte1: 256(1<<8)
通用公式:b4<<24 | b3<<16 | b2<<16 | b1
譬喻,222.173.108.86
转换要领:222<<24 | 173<<16 | 108<<8 | 86 = 3735907414
再譬喻,1.0.1.1
转换要领:1<<24 | 0<<16 | 1<<8 | 1 = 16777473
exnet 中实现如下:
- // IPString2Long 把ip字符串转为数值
- func IPString2Long(ip string) (uint, error) {
- b := net.ParseIP(ip).To4()
- if b == nil {
- return 0, errors.New("invalid ipv4 format")
- }
-
- return uint(b[3]) | uint(b[2])<<8 | uint(b[1])<<16 | uint(b[0])<<24, nil
- }
把数值转换为字符串的逻辑翻转过来即可, exnet 中实现如下:
- // Long2IPString 把数值转为ip字符串
- func Long2IPString(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
- }
【编辑保举】 - 收集维保职员怎样办理IP地点斗嘴的妨碍的要领
- 路由器的IP地点到底在那边看?看完就会
- 收集监控项目,高出254个点位怎样配置IP地点?
- 这五点是局域网IP地点斗嘴、环路的祸首罪魁
- 怎样判定两个IP地点是否在统一个网段?什么是子网掩码?
【责任编辑:未丽燕 TEL:(010)68476606】
点赞 0 (编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|