将IPv6转换为十进制(ip号)

时间:2013-10-23 08:59:06

标签: coldfusion coldfusion-10

我一直在尝试将所有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>

导致错误消息

the argument 1 of inputbasen which is now 2a0329ffffffffffffffffffffffffff must be a valid number in base 16"

有可能实现这一目标吗?您如何看待我处理此类事情的方法?有没有更好的方法来获得基于IP的国家/地区?注意:不要依赖任何在线服务!!

2 个答案:

答案 0 :(得分:5)

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

(实际上,只有在8000000000000000及更高的十六进制值(即2 63 或更高,max for Long) - 2 31之间时才会抛出错误和2 63 -1 InputBaseN函数没有告诉你它已经失败但是错误地返回零。)

解决方法是创建一个没有最大值的BigInteger,并从基数为16的字符串转换为:

BigInt = createObject("java","java.math.BigInteger").init( ipv6 , 16 ).toString()

答案 1 :(得分:1)

我认为你无法获得cf来生成一个大的小数。您需要手动将其作为字符串。