2010-08-25 77 views
5

IPv4的相互转换我有我已经从以前收集的HttpRequest对象接受我的Web服务器IP的的IPv4格式的列表。我有一个java applet,它提供Ipv6格式的IP地址(java applet会返回一串数据以及IP地址)。我需要检查applet返回的IP是否与列表中的任何项目匹配。的IPv6在C#

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

我的web应用程序是建立在ASP.Net C#

编辑

这里是我面临的问题。 Java小应用程序从客户端返回一串IP,我认为这取决于客户端计算机所具有的网卡数量。

随着这个我从ASP.Net HttpRequest对象一个IP地址。我需要找出哪些IP实际用于连接到我的网站并执行一些任务。

的问题是有时我从IPv6格式javaapplet获取只有一个IP,其中的IP我从HttpRequest对象是在IPv4格式,因此比较失败。

回答

4

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

IPv4地址嵌入用于 创建一个IPv4地址 与IPv6地址在 从IPv4到IPv6的转换,以帮助之间的关系。一个 类型,IPv4兼容IPv6地址 ,用于能与IPv4和IPv6 兼容设备;它 开始于96个零位。另, IPv4的映射地址,被用于不属于 兼容IPv6到IPv6 地址空间映射 IPv4的设备;它始于80, 零后接16个。

..

这两种地址之间的差别是很微妙的,但 重要。第80位是 总是零,所以,当这被认为是你 知道它是 某种嵌入的IPv4地址。 IPv4兼容IPv6 地址仅用于实际上可识别IPv6的设备 ; 与IPv4兼容的地址是其传统IPv6地址的另外 。相比之下,如果在初始80之后看到“FFFF”为 的16位,则这个 指定其IPv4地址已被映射为 的常规IPv4设备 成为IPv6格式。它不是支持IPv6的设备。

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

+0

请检查更新后的问题 – 2010-08-26 18:38:30

2

假设您使用某种无线平台或具有无线功能。 IPV6与移动网络AKA“无线”的改进有关。将IPV6转换为IPV4并非您所需要的。 IPV6是一个真实的地址。这是目前最新的IP地址高级标准。看看Here并自己决定。您也可以手动执行here。 IPV6应该掩盖你的IPV4。

希望有所帮助。

+0

请检查更新的问题 – 2010-08-26 18:39:05

3

0A0D似乎已经回答这个问题,但我给它一个镜头:

如果IPv6地址的前10个字节(80位)为零,那么你就可以比较的最后4个字节与4个字节的IPv4地址。

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。如果需要比较任意地址,则根据需要添加额外的逻辑。

+0

上述代码似乎并不完整。根据[标准](http://tools.ietf.org/html/rfc3513),除上述之外,还需要检查IPv6地址上的字节10和11。对于“IPv4兼容的IPv6地址”,它们需要为0,“IPv4映射的IPv6地址”为FF。 – 2013-04-04 17:49:35