use*_*617 3 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>
Run Code Online (Sandbox Code Playgroud)
导致错误消息

是否有可能实现这一目标?您如何看待我处理此类事情的方法?有没有更好的方法来获得基于IP的国家/地区?注意:不想依赖任何在线服务!!
InputBaseN正在尝试转换为Integer,并且该值对于最大Integer值而言太大,因此错误声称它不是有效数字.
(该错误实际上仅针对十六进制值8000000000000000及更高(即2 63或更高,最大值为Long) - 在2 31和2 63 -1 之间抛出,InputBaseN函数不会告诉您它已失败但错误地返回零.)
解决方案是创建一个没有最大值的BigInteger,并从基数为16的字符串转换,如下所示:
BigInt = createObject("java","java.math.BigInteger").init( ipv6 , 16 ).toString()
Run Code Online (Sandbox Code Playgroud)