技术标签:
【中文标题】如何将 IPV6 地址转换为 IPV4 地址?【英文标题】:How can I convert IPV6 address to IPV4 address? 【发布时间】:2011-02-16 17:10:31 【问题描述】:我有一个使用 IPv4 地址的应用程序(它存储它们的时间很长),所以它只理解 IPv4 地址。
是否可以使用 Java 将 IPv6 地址转换为 IPv4?
【问题讨论】:
有 79,228,162,514,264,337,593,543,950,336 倍的 IPv6 地址可能的 IPv4 地址数。 (2^32 个 IPv4 地址和 2^128 个 IPv6 地址,因此 IPv6 的 IPv4 地址数量是 IPv4 的 2^96 倍。) @gotqn "IPv4"、"IPv6" 和 "Java" 不是代码,因此请不要将它们格式化为代码。见Should I use code blocks when mentioning framework names/technologies? 和Inline Code Spans should not be used for emphasis, right? 【参考方案1】:Vishnuraj V"s post 也解决了我的问题。谢谢!
我将函数转换为一个函数并修复了一些小错误:JSFiddle
HTML:
JS:
/* Convert IPv6 address to IPv4 address *//* Fork from: https://***.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);
【讨论】:
【参考方案2】:虽然there are IPv6 equivalents for the IPv4 address range,但您无法将所有 IPv6 地址转换为 IPv4 - IPv6 地址比 IPv4 地址多。
解决此问题的唯一明智方法是更新您的应用程序,使其能够理解和存储 IPv6 地址。
【讨论】:
我知道,但目前大多数地址都在 IPV4 空间内。我只需要方法来转换存在于 IPV4 空间中的那些地址。 请更新您的答案,提供转换方式,然后再警告 IPv6 tp IPv4 兼容性。【参考方案3】: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 可在链接中找到。
【讨论】:
不应该ipv6Address
是 addr
吗? .. 和 ipv4Address
是 derivedIpv4Address
吗?请给我们看一个简洁的代码。代码无论如何都不起作用:getLowerIPv4Address
未定义。 @MagnoC 你是对的,getLowerIPv4Address 是早期版本的库中方法的名称,现在的名称是 getEmbeddedIPv4Address。另外,您对不匹配的 var 名称是正确的,我已经更新了代码示例。【参考方案4】: 这是您在 javascript 中查找的代码。好吧,你知道你不能转换所有的 ipv6 地址
【讨论】:
【参考方案5】:IPv4 和 IPv6 地址之间(IP 地址和设备之间也没有)没有一一对应关系,因此您所要求的通常是不可能的。
有一个特定范围的 IPv6 地址实际上代表了 IPv4 地址空间,但一般的 IPv6 地址不在此范围内。
【讨论】:
以上是关于如何将 IPV6 地址转换为 IPV4 地址?的主要内容,如果未能解决你的问题,请参考以下文章