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

针对这一个问题我在 exnet 扩展包里面实现可两者的转换的快捷方法:

func IP2Long(ip net.IP) (uint, error)func Long2IP(i uint) (net.IP, error)func IPString2Long(ip string) (uint, error)func Long2IPString(i uint) (string, error)

使用示例:

那么是如何将点分十进制的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 | b1222<<24 | 173<<16 | 108<<8 | 86 = 37359074141<<24 | 0<<16 | 1<<8 | 1 = 16777473

exnet 中实现如下:

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

转载: