如何将地址从IPv4转换为IPv6

问题描述:

这可能吗?你怎么能转换一个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地址。

+5

在双堆栈系统中,实际上存在从IPv4到IPv6的映射::: ffff:XXXX:XXXX空间;这通常显示为“:: ffff:192.168.1.1” - 因此在IPv6地址空间中有一个有意义的IPv4地址表示形式。 – 2013-02-17 07:34:26

+1

@DoktorJ,我不认为这是问题。我认为这个请求是为了一个正确的IP6地址,而不是在IP6堆栈上引用一个IP4地址的方法。 – Yishai 2013-02-19 21:26:02

+1

@DoktorJ但是除非你有一种路由功能,否则这个映射并不能真正帮助你。 – glglgl 2013-04-29 12:20:01

在IPv6中,IPv4地址中有一个保留的地址空间,您只需在IPv4地址前加上96个0位即可。例如。 192.168.10.13 -> ::C0A8:0A0D。据我所知,这已被弃用,并没有直接转换可用了。

+7

我认为仍有IPv4映射的IPv6地址未被弃用。你在这个方案中的例子是:: ffff:c0a8:0a0d。其中带有0的那个称为IPv4兼容的IPv6地址。 – 2009-12-09 11:22:29

混合双栈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]; 

还要检查this

是IPv4兼容。

IPv4地址:例如192.168.99.1

第一步>

除以第一个八位字节(192)由16(十六进制以来是基-16) IE:一十六分之一百九十二= 12倍正好与0遗留 - 在十六进制12被表示为C - 0(零)以十六进制是,你猜,0 因此192 HEX是C0

第二步>

与第二个八位位组(168)重复步骤1, IE:十六分之一百六十八8 = 10倍遗留因为10×6 = 160, - 10 HEX是A - 8 HEX是8 因此168 HEX是A8

步骤3>

重复规则!第三个八位字节(99) IE:99/16 = 6次,3遗留 - 6 HEX是6 - 3 HEX是3 因此,在HEX 99

步骤4>

最后八位字节 IE:1/16 = 0次与1遗留 - 0在HEX,则是它是0 - 1 HEX是1 因此1 HEX被

所以IPv4的地址在IPv6地址部分中表示的192.168.99.1将是C0A8:6301。然而,你必须使用小写字母,并添加所有丢失的字节的IPv6,所以正确的代码是:

:: c0a8:6301

,或者您可以使用语法现在总是接受:

:: 192.168.99.1

所以最后一个IPv6地址可以是旧的地址与老地址前::字符。