【问题标题】:How can I convert IPV6 address to IPV4 address?如何将 IPV6 地址转换为 IPV4 地址?
【发布时间】:2011-02-16 17:10:31
【问题描述】:

我有一个使用 IPv4 地址的应用程序(它存储它们的时间很长),所以它只理解 IPv4 地址。

是否可以使用 Java 将 IPv6 地址转换为 IPv4?

【问题讨论】:

标签: java ip-address ipv6 ipv4


【解决方案1】:

Vishnuraj V's post 也解决了我的问题。谢谢!

我将函数转换为一个函数并修复了一些小错误: JSFiddle

HTML:

<div id="ipAddress">

</div>

JS:

/* Convert IPv6 address to IPv4 address */
/* Fork from: https://stackoverflow.com/a/23147817/11404332 */
function IP6to4(ip6) {
    function parseIp6(ip6str) {
        const str = ip6str.toString();

        // Initialize
        const ar = new Array();
        for (var i = 0; i < 8; i++) ar[i] = 0;

        // Check for trivial IPs
        if (str == '::') return ar;
        
        // Parse
        const sar = str.split(':');
        let slen = sar.length;
        if (slen > 8) slen = 8;
        let j = 0;
        i = 0
        for (i = 0; i < slen; i++) {
            // This is a "::", switch to end-run mode
            if (i && sar[i] == '') {
                j = 9 - slen + i;
                continue;
            }
            ar[j] = parseInt(`0x0${sar[i]}`);
            j++;
        }

        return ar;
    }

    var ip6parsed = parseIp6(ip6);
    const ip4 = `${ip6parsed[6] >> 8}.${ip6parsed[6] & 0xff}.${ip6parsed[7] >> 8}.${ip6parsed[7] & 0xff}`;
    return ip4;
}

/* Usage */
const ipAddress = '0:0:0:0:0:FFFF:7F00:0001';
document.getElementById("ipAddress").innerText = IP6to4(ipAddress);

【讨论】:

    【解决方案2】:

    虽然there are IPv6 equivalents for the IPv4 address range,但您无法将所有 IPv6 地址转换为 IPv4 - IPv6 地址比 IPv4 地址多。

    解决此问题的唯一明智方法是更新您的应用程序,使其能够理解和存储 IPv6 地址。

    【讨论】:

    • 我知道,但目前大多数地址都在 IPV4 空间内。我只需要方法来转换存在于 IPV4 空间中的那些地址。
    • 请更新您的答案,提供转换方式,然后再警告 IPv6 tp IPv4 兼容性。
    【解决方案3】:

    The IPAddress Java library 可以完成您在此处描述的内容。

    IPv6 地址为 16 个字节。使用该库,如果您从 16 字节数组开始,则可以构造 IPv6 地址对象:

    IPv6Address addr = new IPv6Address(bytes); //bytes is byte[16]
    

    从那里您可以检查地址是否为 IPv4 映射、IPv4 兼容、IPv4 转换等(IPv6 表示 IPv4 地址的方式有很多种)。在大多数情况下,如果一个 IPv6 地址代表一个 IPv4 地址,则 ipv4 地址在低 4 个字节中,因此您可以得到如下的派生 IPv4 地址。之后,您可以转换回字节,这对于 IPv4 来说只有 4 个字节。

        if(addr.isIPv4Compatible() || addr.isIPv4Mapped()) {
            IPv4Address derivedIpv4Address = addr.getEmbeddedIPv4Address();
            byte ipv4Bytes[] = derivedIpv4Address.getBytes();
            ...
         }
    

    javadoc 可在链接中找到。

    【讨论】:

    • 不应该 ipv6Addressaddr 吗? .. 和 ipv4AddressderivedIpv4Address 吗?请给我们看一个简洁的代码。代码无论如何都不起作用:getLowerIPv4Address 未定义。
    • @MagnoC 你是对的,getLowerIPv4Address 是早期版本的库中方法的名称,现在的名称是 getEmbeddedIPv4Address。另外,您对不匹配的 var 名称是正确的,我已经更新了代码示例。
    【解决方案4】:

    这是您在 javascript 中查找的代码。好吧,你知道你不能转换所有的 ipv6 地址

    <script>
    function parseIp6(str)
    {
      //init
      var ar=new Array;
      for(var i=0;i<8;i++)ar[i]=0;
      //check for trivial IPs
      if(str=="::")return ar;
      //parse
      var sar=str.split(':');
      var slen=sar.length;
      if(slen>8)slen=8;
      var j=0;
      for(var i=0;i<slen;i++){
        //this is a "::", switch to end-run mode
        if(i && sar[i]==""){j=9-slen+i;continue;}
        ar[j]=parseInt("0x0"+sar[i]);
        j++;
      }
    
      return ar;
    }
    function ipcnvfrom6(ip6)
    {
      var ip6=parseIp6(ip6);
      var ip4=(ip6[6]>>8)+"."+(ip6[6]&0xff)+"."+(ip6[7]>>8)+"."+(ip6[7]&0xff);
      return ip4;
    }
    alert(ipcnvfrom6("::C0A8:4A07"));
    </script>
    

    【讨论】:

      【解决方案5】:

      IPv4 和 IPv6 地址之间(IP 地址和设备之间也没有)没有一一对应关系,因此您所要求的通常是不可能的。

      有一个特定范围的 IPv6 地址实际上代表了 IPv4 地址空间,但一般的 IPv6 地址不在此范围内。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-06
        • 1970-01-01
        • 1970-01-01
        • 2018-01-23
        • 1970-01-01
        • 2013-11-14
        • 2012-12-25
        相关资源
        最近更新 更多