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

new*_*bie 12 java ip-address ipv4 ipv6

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

是否有可能转换IPv6地址IPv4Java

All*_*nJB 17

虽然IPv4地址范围有IPv6等价物,但您无法将所有IPv6地址转换为IPv4 - IPv6地址多于IPv4地址.

解决此问题的唯一方法是更新您的应用程序以便能够理解和存储IPv6地址.

  • 请在注意 IPv6 tp IPv4 兼容性之前更新您的答案,提供转换方式。 (4认同)
  • 我知道,但目前大多数地址都在IPV4空间内.我只需要方法来转换IPV4空间中存在的那些地址. (2认同)

Sea*_*n F 8

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

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

IPv6Address addr = new IPv6Address(bytes); //bytes is byte[16]
Run Code Online (Sandbox Code Playgroud)

从那里您可以检查地址是否已映射 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();
        ...
     }
Run Code Online (Sandbox Code Playgroud)

链接中提供了 javadoc。


Vis*_*j V 6

这是您在 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>
Run Code Online (Sandbox Code Playgroud)


Dam*_*ver 5

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

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