如何将IPV6地址转换为IPV4地址?

问题描述 投票:0回答:6

我有使用 IPv4 地址的应用程序(它存储它们很长),因此它只能理解 IPv4 地址。

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

java ip-address ipv6 ipv4
6个回答
24
投票

虽然 IPv4 地址范围有 IPv6 等效项,但您无法将所有 IPv6 地址转换为 IPv4 - IPv6 地址比 IPv4 地址多。

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


9
投票

IPAddress Java 库可以完成您在此处描述的任务。

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。


7
投票

这是您正在寻找的 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>

6
投票

IPv4 和 IPv6 地址之间(IP 地址和设备之间)不存在 1-1 对应关系,因此您所要求的通常是不可能的。

有一个特定的 IPv6 地址范围实际上代表 IPv4 地址空间,但一般 IPv6 地址不会来自该范围。


1
投票

Vishnuraj V 的帖子也解决了我的问题。谢谢!

我将这些函数转换为一个函数并修复了一些小错误: 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);

0
投票

我是 https://ipxplorer.com/tools/convert-ipv6-to-ipv4 的作者,这是一个在线 IPv6 到 IPv4 地址转换器。

以下是转换器如何进行转换

public String convertIpv6To4(String ipv6) throws UnknownHostException, RuntimeException{
    try {
        InetAddress inetAddress = InetAddress.getByName(ipv6);
        if (inetAddress instanceof Inet6Address) {
            byte[] ipv6Bytes = inetAddress.getAddress();
            byte[] ipv4Bytes = new byte[4];
            System.arraycopy(ipv6Bytes, 12, ipv4Bytes, 0, 4);
            InetAddress ipv4Address = InetAddress.getByAddress(ipv4Bytes);
            return (ipv4Address.getHostAddress());
        } else {
            throw new RuntimeException("Not an IPv6 address.");
        }
    } catch (UnknownHostException e) {
        throw new UnknownHostException("Invalid IPv6 address");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.