我有使用IPv4
地址的应用程序(它存储它们很长),因此它只能理解IPv4
个地址。
是否可以使用IPv6
将IPv4
地址转换为Java
?
答案 0 :(得分:18)
虽然there are IPv6 equivalents for the IPv4 address range,但您无法将所有IPv6地址转换为IPv4 - IPv6地址多于IPv4地址。
解决此问题的唯一方法是更新您的应用程序,以便能够理解和存储IPv6地址。
答案 1 :(得分:4)
The IPAddress Java library可以完成您在此处描述的内容。
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。
答案 2 :(得分:2)
以下是您在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>
答案 3 :(得分:1)
IPv4和IPv6地址之间没有1-1对应关系(IP地址和设备之间也没有),因此通常无法满足要求。
有一个特定范围的IPv6地址实际上代表IPv4地址空间,但一般的IPv6地址不在此范围内。
答案 4 :(得分:1)
一些谷歌搜索引导我到以下帖子:
http://www.developerweb.net/forum/showthread.php?t=3434
帖子中提供的代码是C语言,但将其重写为Java应该不会太难。
答案 5 :(得分:1)
Vishnuraj V's post 也解决了我的问题。谢谢!
我将函数转换为一个函数并修复了一些小错误: 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);