加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

IP地址转换:数字与字符串之间的转换

发布时间:2019-03-27 11:33:36 所属栏目:教程 来源:戚银
导读:IP 地址库中 IP 地址的保存格式一般有两种,一种是点分十进制形式(192.168.1.1),另一种是数字形式(3232235777),应用中,经常需要在这两种格式之间做转换。 针对这一个问题我在 exnet 扩展包里面实现可两者的转换的快捷方法: func IP2Long(ip net.IP) (u

IP 地址库中 IP 地址的保存格式一般有两种,一种是点分十进制形式(192.168.1.1),另一种是数字形式(3232235777),,应用中,经常需要在这两种格式之间做转换。

IP地址转换:数字与字符串之间的转换

针对这一个问题我在 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 字符串

使用示例:

  1. package main 
  2.  
  3. import ( 
  4.     "fmt" 
  5.     "net" 
  6.     "reflect" 
  7.  
  8.     "github.com/thinkeridea/go-extend/exnet" 
  9.  
  10. func main() { 
  11.     ip := "192.168.1.1" 
  12.  
  13.     n, _ := exnet.IPString2Long(ip) 
  14.     s, _ := exnet.Long2IPString(n) 
  15.  
  16.     fmt.Println(n, s == ip) 
  17.  
  18.     Ip1 := net.ParseIP(ip) // 会得到一个16字节的byte,主要为了兼容ipv6 
  19.     n, _ = exnet.IP2Long(Ip1) 
  20.  
  21.     Ip2, _ := exnet.Long2IP(n) 
  22.  
  23.     fmt.Println(n, reflect.DeepEqual(Ip1[12:], Ip2)) 

那么是如何将点分十进制的IP地址转为数字?

IPv4 地址有4个字节,样式如下:

  • MSB————–LSB
  • b4 b3 b2 b1

每个字节表示的范围:

  • 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 中实现如下:

  1. // IPString2Long 把ip字符串转为数值 
  2. func IPString2Long(ip string) (uint, error) { 
  3.     b := net.ParseIP(ip).To4() 
  4.     if b == nil { 
  5.         return 0, errors.New("invalid ipv4 format") 
  6.     } 
  7.  
  8.     return uint(b[3]) | uint(b[2])<<8 | uint(b[1])<<16 | uint(b[0])<<24, nil 

把数值转换为字符串的逻辑翻转过来即可, exnet 中实现如下:

  1. // Long2IPString 把数值转为ip字符串 
  2. func Long2IPString(i uint) (string, error) { 
  3.     if i > math.MaxUint32 { 
  4.         return "", errors.New("beyond the scope of ipv4") 
  5.     } 
  6.  
  7.     ip := make(net.IP, net.IPv4len) 
  8.     ip[0] = byte(i >> 24) 
  9.     ip[1] = byte(i >> 16) 
  10.     ip[2] = byte(i >> 8) 
  11.     ip[3] = byte(i) 
  12.  
  13.     return ip.String(), nil 

【编辑推荐】

  1. 网络维保人员如何解决IP地址冲突的故障的方法
  2. 路由器的IP地址到底在哪里看?看完就会
  3. 网络监控项目,超过254个点位如何设置IP地址?
  4. 这五点是局域网IP地址冲突、环路的罪魁祸首
  5. 如何判断两个IP地址是否在同一个网段?什么是子网掩码?
【责任编辑:未丽燕 TEL:(010)68476606】
点赞 0

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读