24

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

这里有几个例子:

0.0.0.0   -> ::
127.0.0.1 -> ::1

我正在用 Java 寻找解决方案。

谢谢,

4

6 回答 6

31

没有有意义的 IPv4 到 IPv6 映射。0.0.0.0 和 127.0.0.1 之类的东西在规范中是特殊情况,因此它们具有相同的含义。但是给定一个 IPv4 地址,它不会告诉您它的特定 IPv6 地址是什么。您可以使用 DNS 查找来查看给定的 IP 地址是否解析为主机,该主机又解析为 IPv6 地址和 IPv4 地址,但必须将 DNS 服务器配置为支持特定机器。

于 2009-10-12T16:45:45.923 回答
20

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

还要检查这个

于 2010-04-28T10:21:34.347 回答
6

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

于 2009-10-12T16:48:11.050 回答
3

IPv6 与 IPv4 兼容。

IPv4 地址:例如 192.168.99.1

第一步 >

将第一个八位字节 (192) 除以 16(因为 Hex 是 Base-16) IE:192/16 = 12 次,正好剩下 0 – 十六进制中的 12 表示为 C – 十六进制中的 0(零),你猜到了它, 0 因此十六进制的 192 是C0

第二步 >

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

第三步 >

重复规则!!!第三个八位字节 (99) IE : 99/16 = 6 次,剩下 3 个 – 十六进制中的 6 为 6 – 十六进制中的 3 为 3 因此十六进制中的 99 为63

第四步 >

最后一个八位字节 IE:1/16 = 0 次,剩下 1 - HEX 中的 0 是,是的,它是 0 - HEX 中的 1 是 1 因此 HEX 中的 1 是01

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

::c0a8:6301

或者您可以使用现在始终接受的语法:

::192.168.99.1

所以最后一个 IPv6 地址可以是旧地址,在旧地址之前带有::字符。

于 2016-05-23T10:16:46.243 回答
2

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

IPAddress Java 库提供了一些方法来帮助将 IPv4 转换为 IPv6 的许多最常见的方法。免责声明:我是那个图书馆的项目经理。

例如,给定一个 IPv4 地址,您可以使用 IPv6 映射转换将其转换为 IPv6,如下所示:

IPv6Address ipv6Address = new IPAddressString("1.2.3.4").getAddress().toIPv4().
    getIPv4MappedAddress();
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.getEmbeddedIPv4Address();
    byte ipv4Bytes[] = ipv4Address.getBytes();
    ...
 }
于 2018-03-27T15:17:38.553 回答
-2

这是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"));

于 2018-12-13T11:04:48.907 回答