3

我一直在尝试将所有 IP 地址(IPv4 和 IPv6)转换为十进制格式(IP 号),将这些数字存储在已经包含 IP 范围的数据库中,并根据用户的 IP 获取国家/地区位置。虽然这对于 IPv4 地址可以轻松完成,但在涉及 IPv6 地址时我遇到了障碍。

说闲置的IP应该转换为十进制 2a03:29ff:ffff:ffff:ffff:ffff:ffff:ffff

我通过一些在线服务(将 IPv6 转换为十进制)对其进行了测试,只是为了检查一致性,即我的最终结果应该是什么样子。
https://www.ultratools.com/tools/decimalCalc
http://www.ipaddressguide.com/ipv6-to-decimal
都返回相同的数字 - 55844004574745424515003293805316145151

现在在我的coldfusion代码中,我首先删除:从IP获取十六进制格式,然后尝试将其转换为十进制

<cfset ipv6='2a0329ffffffffffffffffffffffffff'>
<cfoutput>#inputBaseN(ipv6, 16)#</cfoutput>

导致错误消息

inputbasen 的参数 1 现在是 2a0329ffffffffffffffffffffffffff 必须是基数为 16 的有效数字

有可能做到这一点吗?您如何看待我处理此类事情的方法?有没有更好的方法来根据 IP 获取国家/地区位置?注意:不想依赖任何在线服务!!

4

2 回答 2

5

InputBaseN 正在尝试转换为 Integer,并且该值对于最大 Integer value来说太大了,因此错误声称它不是有效数字。

(该错误实际上仅针对 8000000000000000 及更高的十六进制值(即 2 63或更高,Long 的最大值) - 在 2 31和 2 63 -1 之间, InputBaseN 函数不会告诉您它失败但错误地返回零.)

解决方案是创建一个没有最大值的BigInteger ,并从您的基数 16 字符串转换,如下所示:

BigInt = createObject("java","java.math.BigInteger").init( ipv6 , 16 ).toString()
于 2013-10-23T12:05:24.157 回答
1

我认为您将无法让 cf 生成那么大的小数。您需要将其作为字符串手动执行。

于 2013-10-23T11:44:58.917 回答