ColdFusion 128位无符号整数到IPv6

ColdFusion 128位无符号整数到IPv6,coldfusion,coldfusion-11,Coldfusion,Coldfusion 11,我在这里发布了一个将IPv6地址转换为128位无符号int值的函数: 我需要一个函数,它现在将向另一个方向发展 这个函数变得更复杂,我将在答案中解释其复杂性。下面是一个函数,它将128位无符号整数转换为具有正确(简明)IPv6格式的IPv6地址 说明: 像这样的函数的部分问题是,传递到函数(nUInt128)中的数字不能保证是128位无符号整数。它可能是8位(::1)甚至是奇怪的东西,比如有符号的136位数字(ColdFusion/Java似乎更喜欢有符号整数)。如果没有转换为具有16个值的Ja

我在这里发布了一个将IPv6地址转换为128位无符号int值的函数:

我需要一个函数,它现在将向另一个方向发展


这个函数变得更复杂,我将在答案中解释其复杂性。

下面是一个函数,它将128位无符号整数转换为具有正确(简明)IPv6格式的IPv6地址

说明: 像这样的函数的部分问题是,传递到函数(nUInt128)中的数字不能保证是128位无符号整数。它可能是8位(::1)甚至是奇怪的东西,比如有符号的136位数字(ColdFusion/Java似乎更喜欢有符号整数)。如果没有转换为具有16个值的Java字节数组的128位数字,将导致Java.net.Inet6Address.getAddress()抛出错误。我的解决方案是创建一个包含16个零的ColdFusion数组并对其进行反填充,然后将其与java.net.Inet6Address.getAddress()一起使用。我很惊讶,这是有效的,因为我不知道数组中的数字有多大。ColdFusion/Java不知何故发挥了一些魔力,将数组变成了一个字节[]。背面填充还去除了较大的数字,并修复了136位有符号整数的问题

<cffunction name="UInt128ToIPv6" returntype="string" output="no" access="public" hint="returns IPv6 address for uint128 number">
    <cfargument name="nUInt128" type="numeric" required="yes" hint="uint128 to convert to ipv6 address">

    <cfif arguments.nUInt128 EQ 0>
        <cfreturn "">
    </cfif>

    <cftry>
        <cfset local['javaMathBigInteger'] = CreateObject("java", "java.math.BigInteger").init(arguments.nUInt128)>
        <cfset local['JavaNetInet6Address'] = CreateObject("java", "java.net.Inet6Address")>
        <cfset local['arrBytes'] = local.javaMathBigInteger.toByteArray()>

        <!--- correct the array length if !=16 bytes --->
        <cfset local['arrFixedBytes'] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]>
        <cfif arrayLen(local.arrBytes) NEQ 16>
            <cfset local['nFixedIndex'] = 16>
            <cfset local['nBytesIndex'] = arrayLen(local.arrBytes)>

            <cfloop condition="local.nFixedIndex NEQ 0 && local.nBytesIndex NEQ 0">
                <cfset local.arrFixedBytes[local.nFixedIndex] = local.arrBytes[local.nBytesIndex]>
                <cfset local.nFixedIndex-->
                <cfset local.nBytesIndex-->
            </cfloop>
        </cfif>
        <!--- /correct the array length if !=16 bytes --->

        <cfif arrayLen(local.arrBytes) NEQ 16>
            <cfset local['vcIPv6'] = local.JavaNetInet6Address.getByAddress(local.arrFixedBytes).getHostAddress()>
        <cfelse>
            <cfset local['vcIPv6'] = local.JavaNetInet6Address.getByAddress(local.javaMathBigInteger.toByteArray()).getHostAddress()>
        </cfif>
        <cfcatch type="any">
            <cfset local['vcIPv6'] = "">
        </cfcatch>
    </cftry>

    <cfreturn formatIPv6(vcIPv6 = local.vcIPv6)>
</cffunction>

下面是在上一个函数末尾调用的formatIPv6()实用程序函数

<cffunction name="formatIPv6" returntype="string" output="yes" access="public" hint="returns a compressed ipv6 address">
    <cfargument name="vcIPv6" type="string" required="yes" hint="IPv6 address">

    <!--- inside reReplace removes leading zeros, outside reReplace removes repeating ":" and "0:" --->
    <cfreturn reReplace(reReplace(LCase(arguments.vcIPv6), "(:|^)(0{0,3})([1-9a-f]*)", "\1\3", "all"), "(^|:)[0|:]+:", "::", "all")>
</cffunction>


如果您有任何建议/问题,请留下评论。

可能吗?显然。有人要求从另一个问题中查看这些函数。这种东西(没有任何解释的负面评价)真的让一个人根本不想贡献。嗯,这应该在