解决IP2Location十进制值转IP地址的Go语言实现问题
问题:IP2Location整数IP转PostgreSQL兼容的INET类型地址
背景与转换逻辑
IP2Location数据库中的IP范围以起始IP和结束IP的整数形式表示,其IP转整数的逻辑等效于以下PHP代码:
function ip62long($ipv6) { return (string) gmp_import(inet_pton($ipv6)); }
其中IPv4地址会被添加::ffff:前缀后再进行转换。
当前需求与存在问题
我正在尝试将IP2Location数据库导入PostgreSQL,计划使用INET类型列存储IP地址,因此需要将这些整数逆向转换为IP地址。
我目前使用的Go语言转换代码如下:
func StringToIp(in string) net.IP { var bigint big.Int bigint.SetString(in, 10) return bigint.Bytes() }
该代码对普通IPv6地址(例如55838750788714571402502155597250560000转换为2a02:26f7:e5c4:c6c1::)及无前缀的IPv4地址(例如16909060转换为1.2.3.4)可以正常工作,但存在以下问题:
- 所有带
::ffff:前缀的IPv4地址,例如281470681743360应转换为0.0.0.0,但当前得到错误结果; - 特殊值如
0、281470681743359、281474439839744、281474976710656无法正确转换。
寻求解决方案
需要一个能正确处理所有上述情况的Go语言实现,以满足PostgreSQL存储及后续IP查询的需求。
内容的提问来源于stack exchange,提问作者some-user
相关产品推荐
相关产品推荐

