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
bederivedIpv4Address
?请给我们一个简明的代码。代码仍然不起作用:getLowerIPv4Address
未定义。@如果正确,getLowerIPv4Address是库的早期版本中的方法名称,该名称现在是getEmbeddedIPv4Address。另外,关于不匹配的var名称,您是对的,我已经更新了代码示例。有79228162514264337593543950336倍于IPv6地址的可能IPv4地址数。(2^32个IPv4地址和2^128个IPv6地址,因此IPv6的IPv4地址数是IPv4的2^96倍。)