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

Java 如何将IPV6地址转换为IPV4地址?,java,ip-address,ipv6,ipv4,Java,Ip Address,Ipv6,Ipv4,我的应用程序使用的是IPv4地址(它存储的地址很长),所以它只理解IPv4地址 是否可以使用Java将IPv6地址转换为IPv4?在IPv4和IPv6地址之间(或者在IP地址和设备之间)没有1-1对应关系,因此您所要求的通常是不可能的 有一个特定的IPv6地址范围实际上代表IPv4地址空间,但一般IPv6地址将不在此范围内。但是,您不能将所有IPv6地址转换为IPv4-IPv6地址比IPv4地址多 解决此问题的唯一明智方法是更新应用程序,使其能够理解和存储IPv6地址。一些谷歌搜索将我引向以下帖

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


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

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

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

但是,您不能将所有IPv6地址转换为IPv4-IPv6地址比IPv4地址多


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

一些谷歌搜索将我引向以下帖子:


文章中提供的代码是C语言的,但将其重写为Java应该不会太难。

以下是您在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>

函数解析IP6(str)
{
//初始化
var-ar=新数组;
对于(VarI=0;i8)slen=8;
var j=0;
对于(变量i=0;i>8)+“+”(ip6[6]&0xff)+“+”(ip6[7]>>8)+“+”(ip6[7]&0xff);
返回ip4;
}
警报(ipcnvfrom6(“::C0A8:4A07”);
可以完成您在这里描述的内容

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可以在链接中找到。

我知道,但目前大多数地址都在IPV4空间内。我只需要使用一个方法来转换IPV4空间中存在的地址。请在注意IPv6 tp IPV4兼容性之前更新您的答案,提供转换方法。IPv6地址不应该是
addr
。。和
ipv4Address
be
derivedIpv4Address
?请给我们一个简明的代码。代码仍然不起作用:
getLowerIPv4Address
未定义。@如果正确,getLowerIPv4Address是库的早期版本中的方法名称,该名称现在是getEmbeddedIPv4Address。另外,关于不匹配的var名称,您是对的,我已经更新了代码示例。有79228162514264337593543950336倍于IPv6地址的可能IPv4地址数。(2^32个IPv4地址和2^128个IPv6地址,因此IPv6的IPv4地址数是IPv4的2^96倍。)