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

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

问题描述:

我的应用程序使用了IPv4地址(它将它们存储了很久),所以它只能理解IPv4地址。如何将IPV6地址转换为IPV4地址?

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

虽然there are IPv6 equivalents for the IPv4 address range,您不能将所有IPv6地址转换为IPv4 - 有更多的IPv6地址比有IPv4地址。

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

+2

我知道,但目前大部分地址都在IPV4空间内。我只需要转换IPV4空间中存在的那些地址的方法。 – newbie 2010-05-07 06:38:47

+0

请更新您的答案,提供在谨慎处理IPv6 tp IPv4兼容性之前进行转换的方法。 – zeliboba 2017-02-07 03:45:31

IPv4和IPv6地址之间(以及IP地址和设备之间)没有1-1对应关系,所以你一般要求的是不可能的。

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

一些谷歌搜索使我对以下岗位:

http://www.developerweb.net/forum/showthread.php?t=3434

在帖子中提供的代码是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> 

The IPAddress Java library可以完成你所描述这里。

IPv6地址是16个字节。使用该库,如果你开始与一个16字节数组,你可以构建IPv6地址对象:

IPv6Address addr = new IPv6Address(bytes); 

从那里你可以检查地址,IPv4映射,兼容IPv4,IPv4的翻译,等等(IPv6代表IPv4地址的方式有很多种)。在大多数情况下,如果IPv6地址表示IPv4地址,则ipv4地址位于较低的4个字节中,因此您可以按如下方式获取派生的IPv4地址。之后,您可以将其转换回字节,IPv4将只有4个字节。

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

javadoc可在链接中找到。