如何将地址从IPv4转换为IPv6

时间:2009-10-12 16:33:31

标签: java ipv6

这可能吗?如何将ipv4转换为ipv6地址?

这里有几个例子:

0.0.0.0   -> ::
127.0.0.1 -> ::1

我正在用Java搜索解决方案。

谢谢,

6 个答案:

答案 0 :(得分:31)

没有有意义的IPv4到IPv6映射。像0.0.0.0和127.0.0.1这样的东西是规范中的特例,所以它们具有相同的含义。但是考虑到IPv4地址,它不会告诉您具体的IPv6地址是什么。您可以使用DNS查找来查看给定的IP地址是否解析为主机,而该主机除了IPv4地址之外还会解析为IPv6地址,但DNS服务器必须配置为支持特定计算机的IP地址。 / p>

答案 1 :(得分:19)

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

答案 2 :(得分:5)

IPv6中曾经有一个用于IPv4地址的保留地址空间,您只需在其中添加96个0位的IPv4地址作为前缀。例如。 192.168.10.13 -> ::C0A8:0A0D。据我所知,这已被弃用,并且不再提供直接转换。

答案 3 :(得分:3)

IPv6与IPv4兼容。

IPv4地址:示例192.168.99.1

Step1&gt;

将第一个八位位组(192)除以16(因为Hex是Base-16) IE:192/16 =完全12次,剩下0 - 十六进制中的12表示为C. - Hex中的0(零),你猜对了,0 因此,HEX中的192是 C0

Step2&gt;

用第二个八位位组(168)重复步骤1, IE:168/16 = 10次,剩下8次因为10 * 6 = 160, - 十六进制中的10是A. - HEX中的8是8 因此,HEX中的168是 A8

第3步&gt;

重复规则!第三个八位组(99) IE:99/16 = 6次,剩下3次 - 六十六分中的6分是6分 - HEX中的3是3 因此,HEX中的99 63

Step4&gt;

最后一个八位字节 IE:1/16 = 0次,剩余1次 - 在十六进制中是0,是的它是0 - HEX中的1是1 因此,HEX中的1 01

因此,IPv6地址部分中表示的IPv4地址192.168.99.1将为 C0A8:6301 。但是,您必须使用小写并添加所有丢失的字节IPv6,因此正确的代码是:

<强> :: c0a8:6301

或者您现在可以使用语法:

<强> :: 192.168.99.1

因此,最终IPv6地址可以是旧地址之前的 :: 字符。

答案 4 :(得分:2)

有许多方法可以将IPv4映射到IPv6。对于大多数此类方法,转换后的IPv4地址位于16字节IPv6地址的低4字节中。

The IPAddress Java library提供了一些方法来协助将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();
    ...
 }

答案 5 :(得分:-1)

这是Javascript中的转换代码

/** IPV4 CIDR to IPV6 CIDR conversion **/
function covertIPv6(x){
let ipV4 = x;
let address = ipV4.split('/');
let classValues = [];

if(address.length){
  classValues = address[0].split('.');
}
if(classValues.length){  
  let str = classValues.reduce((acc, val, ind)=>{
    let mod = +val >= 16 ? +val%16 : +val;
    let divider = +val >= 16 ? (val-mod)/16 : 0;
    const hexaCode = (hexaVal)=>{
      switch(hexaVal){
      case 10:
        hexaVal = 'A';
        break;
      case 11:
        hexaVal = 'B';
        break;
      case 12:
        hexaVal = 'C';
        break;
      case 13:
        hexaVal = 'D';
        break;
      case 14:
        hexaVal = 'E';
        break;
      case 15:
        hexaVal = 'F';
        break;
      default:
        hexaVal = hexaVal;
        break;
    }
      return hexaVal;
    }
    mod = hexaCode(mod);
    divider = hexaCode(divider);
    return ind === 1 ? `${acc}${divider}${mod}:`:`${acc}${divider}${mod}`
  },'')
  return `2002:${str}::/${address[1]}`;
}
  return "Invalid Address";
}

// Run the function

console.log(covertIPv6("0.0.0.0/12"));