如何将地址从IPv4转换为IPv6
这可能吗? 如何将ipv4转换为ipv6地址?
这里有几个例子:
0.0.0.0 -> :: 127.0.0.1 -> ::1
我正在用Java搜索解决方案。
谢谢,
没有有意义的IPv4到IPv6映射。 像0.0.0.0和127.0.0.1这样的东西是规范中的特例,所以它们具有相同的含义。 但是考虑到IPv4地址,它不会告诉您具体的IPv6地址是什么。 您可以使用DNS查找来查看给定的IP地址是否解析为主机,而该主机除了IPv4地址之外还可以解析为IPv6地址,但DNS服务器必须配置为支持特定计算机的IP地址。
混合双栈IPv6 / IPv4实现通常支持特殊类别的地址,即IPv4映射地址。 有关更多信息,请查看以下链接
http://en.wikipedia.org/wiki/IPv6#IPv4-mapped_IPv6_addresses
要将IPv4转换为映射的IPv6,可以使用以下命令:
String ip = "127.0.0.1"; String[] octets = ip.split("\\."); byte[] octetBytes = new byte[4]; for (int i = 0; i < 4; ++i) { octetBytes[i] = (byte) Integer.parseInt(octets[i]); } byte ipv4asIpV6addr[] = new byte[16]; ipv4asIpV6addr[10] = (byte)0xff; ipv4asIpV6addr[11] = (byte)0xff; ipv4asIpV6addr[12] = octetBytes[0]; ipv4asIpV6addr[13] = octetBytes[1]; ipv4asIpV6addr[14] = octetBytes[2]; ipv4asIpV6addr[15] = octetBytes[3];
还要检查一下
IPv6中曾经有一个用于IPv4地址的保留地址空间,您只需在其中添加96个0位的IPv4地址作为前缀。 例如192.168.10.13 -> ::C0A8:0A0D
。 据我所知,这已被弃用,并且不再提供直接转换。
IPv6与IPv4兼容。
IPv4地址:示例192.168.99.1
Step1>
将第一个八位位组(192)除以16(因为hex是一个基数为16)IE:192/16 = 12次正好,剩下的0 – hex中的12表示为C – 0(零)在hex中,你猜对了它,因此HEX中的192是C0
Step2>
用第二个八位位组(168)重复步骤1,IE:168/16 = 10次,剩下8个因为10 * 6 = 160,HEX中的-10是HEX中的A – 8是8因此HEX中的168是A8
Step3>
重复规则!!! 第三个八位字节(99)IE:99/16 = 6次,其中3个剩余 – 6个在HEX中6 – 3在HEX中是3因此在HEX中是99个是63
Step4>
最后一个八位字节IE:1/16 = 0次,剩下1个 – 在hex中是0,是的它是0 – 1在HEX中是1因此在HEX中是1是01
因此,在IPv6地址部分中表示的IPv4地址192.168.99.1将是C0A8:6301 。 但是,您必须使用小写并添加所有丢失的字节IPv6,因此正确的代码是:
:: c0a8:6301
或者您可以使用现在始终接受的语法:
:: 192.168.99.1
因此,最终IPv6地址可以是旧地址,在旧地址之前使用:: chars。
有许多方法可以将IPv4映射到IPv6。 对于大多数此类方法,转换后的IPv4地址位于16字节IPv6地址的低4字节中。
IPAddress Java库具有协助许多将IPv4转换为IPv6的最常用方法的方法。 免责声明:我是该图书馆的项目经理。
例如,给定IPv4地址,您可以使用IPv6映射转换转换为IPv6,如图所示:
IPv6Address ipv6Address = new IPAddressString("1.2.3.4").getAddress().toIPv4(). getIPv4MappedAddress().toIPv6(); System.out.println(ipv6Address); // ::ffff:102:304 System.out.println(ipv6Address.toMixedString()); // ::ffff:1.2.3.4
使用IPv6Address实例,您可以检查地址是IPv4映射,IPv4兼容,IPv4转换等等(这些是IPv6表示IPv4地址的许多可能方式)。 之后,您可以转换回IPv4。
if(addr.isIPv4Compatible() || addr.isIPv4Mapped()) { IPv4Address derivedIpv4Address = ipv6Address.getLowerIPv4Address(); byte ipv4Bytes[] = ipv4Address.getBytes(); ... }