ip2location数据库中的IP范围由第一个和最后一个IP表示为整数。
我不知道如何完成从is到整数的转换,但是文档表示它与PHP中的代码等价:
function ip62long($ipv6) {
return (string) gmp_import(inet_pton($ipv6));
}如果它是IPv4 (而不是IPv6),则IP加上'::ffff:'。
我试图使用列类型ip2location将INET数据库导入postgres。我希望将这些整数转换回IP,即恢复这个例程。
到目前为止,我正在使用以下代码:
func StringToIp(in string) net.IP {
var bigint big.Int
bigint.SetString(in, 10)
return bigint.Bytes()
}它适用于:
55838750788714571402502155597250560000 -> 2a02:26f7:e5c4:c6c1::会在理论上起作用
::ffff:前缀),例如16909060 -> 1.2.3.4但这对这些案件不起作用:
::ffff:为前缀,例如281470681743360应该变成0.0.0.0而不是?ffff00000000。0,281470681743359,281474439839744,281474976710656。我正在寻找一种解决方案,将所有这些值分别转换回IPv4或IPv6地址,以便将它们存储在postgres中,并在稍后查找up。
发布于 2022-10-18 06:52:15
造成这个问题的原因似乎是,如果整数不需要,bigint.Bytes()返回的字节数少于16字节,而net.IP则希望返回4或16字节。
在[]byte前加上足够的零将导致适当的net.IP
func StringToIp(in string) net.IP {
var bigint big.Int
bigint.SetString(in, 10)
ip := bigint.Bytes()
for len(ip) < 16 {
ip = append([]byte{0x00}, ip...)
}
return ip
}很高兴看到并接受其他更优雅的.解决方案。
https://stackoverflow.com/questions/74106314
复制相似问题