我有一个IPv4格式的IP列表,我从之前的Web服务器收到的HttpRequest对象中收集了这些IP。我有一个java applet,它以Ipv6格式提供IP地址(java applet返回一堆数据和IP地址)。我需要检查applet返回的IP是否与列表中的任何项匹配。
如何互换IPv6和IPv4格式?
我的网络应用程序基于 ASP.Net C#
修改
这是我面临的问题。 Java applet从客户端返回一堆IP,我假设它取决于客户端机器的网卡数量。
除此之外,我从ASP.Net HTTPRequest对象获取IP地址。我需要找出哪些IP实际用于连接到我的网站并执行一些任务。
问题是有时我只从IPv6格式的javaapplet中获取一个IP,因为我从HTTPRequest对象获得的IP是IPv4格式,因此比较失败。
答案 0 :(得分:4)
您正在谈论IPv4-IPv6映射或IPv4地址嵌入。
使用IPv4地址嵌入 创建IPv4之间的关系 地址和IPv6地址以帮助 从IPv4过渡到IPv6。一 type,兼容IPv4的IPv6 地址,用于设备 兼容IPv4和IPv6;它 以96位零开始。另一个, IPv4映射地址用于 映射不是的IPv4设备 与IPv6兼容的IPv6 地址空间;它从80开始 零后跟16个。
...
这两种地址之间的区别很微妙,但是 重要。前80位是 永远为零,所以当你看到它时 知道它是一个嵌入式IPv4地址 某种。 IPv4兼容的IPv6 地址仅用于设备 实际上是IPv6感知的;该 此外还兼容IPv4兼容地址 其传统的IPv6地址。在 相反,如果看到“FFFF” 这是初始80之后的16位 表示传统的IPv4设备 其IPv4地址已映射 进入IPv6格式。它不是 支持IPv6的设备。
所以底线是除非它们被映射在一起,否则你将无法转换为/从。你需要一个translator。
答案 1 :(得分: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。如果需要比较任意地址,请根据需要添加额外的逻辑。
答案 2 :(得分:2)