5

我有一个 IPv4 格式的 IP 列表,这些 IP 是从我的网络服务器收到的以前的 HttpRequest 对象中收集的。我有一个 java 小程序,它提供 Ipv6 格式的 IP 地址(java 小程序返回一堆数据以及 IP 地址)。我需要检查小程序返回的 IP 是否与列表中的任何项目匹配。

如何相互转换 IPv6 和 IPv4 格式?

我的 Web 应用程序基于ASP.Net C#

编辑

这是我面临的问题。Java小程序从客户端返回一堆IP,我假设这取决于客户端机器拥有的网卡数量。

除此之外,我还从 ASP.Net HTTPRequest 对象中获得了一个 IP 地址。我需要找出实际使用哪个 IP 连接到我的网站并执行一些任务。

问题是有时我从 javaapplet 中仅获得一个 IPv6 格式的 IP,而我从 HTTPRequest 对象获得的 IP 是 IPv4 格式,因此比较失败。

4

3 回答 3

4

您正在谈论 IPv4-IPv6 映射或 IPv4 地址嵌入。

IPv4 地址嵌入用于创建 IPv4 地址和 IPv6 地址之间的关系,以帮助从 IPv4 过渡到 IPv6。一种类型,兼容 IPv4 的 IPv6 地址,用于同时兼容 IPv4 和 IPv6 的设备;它以 96 个零位开头。另一个是 IPv4 映射地址,用于将不兼容 IPv6 的 IPv4 设备映射到 IPv6 地址空间;它以 80 个零开头,然后是 16 个 1。

..

这两种地址之间的区别是微妙的,但很重要。前 80 位始终为零,因此当您看到它时,您就知道它是某种嵌入的 IPv4 地址。IPv4 兼容的 IPv6 地址仅用于实际支持 IPv6 的设备;IPv4 兼容地址是其常规 IPv6 地址的补充。相反,如果在最初的 80 之后的 16 位中看到“FFFF”,则表示其 IPv4 地址已映射到 IPv6 格式的常规 IPv4 设备。它不是支持 IPv6 的设备。

所以底线是除非它们被映射在一起,否则您将无法转换为/从。你需要一个翻译

于 2010-08-25T18:24:12.357 回答
3

0A0D 似乎已经回答了这个问题,但我会试一试:

如果 IPv6 地址的前 10 个字节(80 位)为零,则可以将后 4 个字节与 IPv4 地址的 4 个字节进行比较。

bool AreEquivalent(IPAddress ip6addr, IPAddress ip4addr)
{
  byte[] ip6bytes = ip6addr.GetBytes();
  byte[] ip4bytes = ip4addr.GetBytes();
  for (int i = 0; i < 10; i++)
  {
     if (ip6bytes[i] != 0)
       return false;
  }
  for (int i = 0; i < 4; i++)
  {
     if (ip6bytes[i + 12] != ip4bytes[i])
        return false;
  }
  return true;
}

这假设您已经知道什么是 ipv6 和 ipv4。如果您需要比较任意地址,请酌情添加额外的逻辑。

于 2010-08-31T20:05:37.897 回答
2

假设您使用某种无线平台或有能力进行无线。IPV6 与移动网络 AKA“无线”的改进有关。将 IPV6 转换为 IPV4 并不是您想要的。IPV6 是真实地址。这是当今 IP 地址的新高级标准。看看这里并自己决定。您也可以在此处手动操作。IPV6 应该掩盖您的 IPV4。

希望有帮助。

于 2010-08-25T19:19:28.560 回答