【问题标题】:convert IPv6 to decimal (ip number)将 IPv6 转换为十进制(ip 号)
【发布时间】:2013-10-23 08:59:06
【问题描述】:

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

导致错误消息

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

【问题讨论】:

    标签: coldfusion coldfusion-10


    【解决方案1】:

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

    (该错误实际上只针对 8000000000000000 及更高的十六进制值(即 263 或更高,max for Long) - 介于 231和 263-1 InputBaseN 函数不会告诉您它失败但错误地返回零。)

    解决方案是创建一个BigInteger,它没有最大值,然后像这样从你的 base 16 字符串转换:

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

    【讨论】:

    • 好的,抱歉回复晚了,需要一些时间来测试一些东西 :) 您的解决方案确实有效,但仅适用于完整的 IPv6 地址,而简化的地址 (2c0f:fff0:: , 2c10:: ) 其中前导零或整个零段被删除会导致错误的结果。也就是说,我会尝试编写一个脚本,在需要的地方动态填充零,以便上面的代码可以正确计算结果。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      • 2015-08-10
      • 2013-11-16
      • 1970-01-01
      相关资源
      最近更新 更多