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

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

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

[[260382]]

针对这一个问题我在 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 
责任编辑:未丽燕 来源: thinkeridea博客
相关推荐

2010-07-14 16:10:37

Perl

2009-08-20 11:29:21

C#16进制字符串

2017-06-04 15:24:31

BCD码十进制字符串

2010-09-09 11:02:36

SQL函数IP

2021-08-20 06:58:31

C++Python函数

2010-05-24 15:53:44

MySQL内置函数

2021-11-24 09:08:38

LeetCode字符串算法

2024-08-16 22:00:38

2010-10-11 15:47:46

MySQL字符串大小写

2024-03-12 07:35:39

Python字符串列表

2010-05-26 15:24:09

MySQL字符串

2010-08-30 16:37:48

DHCPIP地址

2023-03-13 07:43:51

PHP类型转换

2021-11-29 08:49:37

字符串转换整数

2011-08-22 10:59:42

SQL Server日期时间格式转换字符串

2010-09-14 14:32:02

sql server日

2016-08-10 13:13:02

Python编程编码

2024-02-19 15:38:08

JsonPython字符串

2013-07-25 15:01:47

iOS开发学习十六进制和字符串转换

2010-03-30 16:45:22

Oracle 字符串
点赞
收藏

51CTO技术栈公众号