Как я могу преобразовать адрес IPV6 в адрес IPV4? - PullRequest
11 голосов
/ 07 мая 2010

У меня есть приложение, которое использует IPv4 адреса (оно хранит их как долго), поэтому оно понимает только IPv4 адреса.

Можно ли преобразовать адрес IPv6 в IPv4 с помощью Java?

Ответы [ 5 ]

18 голосов
/ 07 мая 2010

Хотя есть эквиваленты IPv6 для диапазона адресов IPv4 , вы не можете преобразовать все адреса IPv6 в IPv4 - адресов IPv6 больше, чем адресов IPv4.

Единственный разумный способ обойти эту проблему - обновить приложение, чтобы оно могло понимать и хранить адреса IPv6.

4 голосов
/ 07 сентября 2016

Java-библиотека IPAddress может выполнить то, что вы здесь описываете.

IPv6-адреса - 16 байтов. Используя эту библиотеку, если вы начинаете с 16-байтового массива, вы можете создать объект адреса IPv6:

IPv6Address addr = new IPv6Address(bytes); //bytes is byte[16]

Оттуда вы можете проверить, сопоставлен ли адрес IPv4, совместим с IPv4, переведен IPv4 и т. Д. (Существует множество возможных способов, с помощью которых IPv6 представляет адреса IPv4). В большинстве случаев, если адрес IPv6 представляет адрес IPv4, адрес ipv4 находится в младших 4 байтах, и поэтому вы можете получить производный адрес IPv4 следующим образом. После этого вы можете преобразовать обратно в байты, которые будут только 4 байта для IPv4.

    if(addr.isIPv4Compatible() || addr.isIPv4Mapped()) {
        IPv4Address derivedIpv4Address = addr.getEmbeddedIPv4Address();
        byte ipv4Bytes[] = derivedIpv4Address.getBytes();
        ...
     }

Javadoc доступен по ссылке.

2 голосов
/ 18 апреля 2014

Вот код, который вы ищете в javascript.Ну, вы знаете, что вы не можете конвертировать все адреса IPv6

<script>
function parseIp6(str)
{
  //init
  var ar=new Array;
  for(var i=0;i<8;i++)ar[i]=0;
  //check for trivial IPs
  if(str=="::")return ar;
  //parse
  var sar=str.split(':');
  var slen=sar.length;
  if(slen>8)slen=8;
  var j=0;
  for(var i=0;i<slen;i++){
    //this is a "::", switch to end-run mode
    if(i && sar[i]==""){j=9-slen+i;continue;}
    ar[j]=parseInt("0x0"+sar[i]);
    j++;
  }

  return ar;
}
function ipcnvfrom6(ip6)
{
  var ip6=parseIp6(ip6);
  var ip4=(ip6[6]>>8)+"."+(ip6[6]&0xff)+"."+(ip6[7]>>8)+"."+(ip6[7]&0xff);
  return ip4;
}
alert(ipcnvfrom6("::C0A8:4A07"));
</script>
1 голос
/ 07 мая 2010

Некоторые поиски привели меня к следующему сообщению:

http://www.developerweb.net/forum/showthread.php?t=3434

Код, приведенный в сообщении, написан на C, но его не должно быть слишком сложно переписать на Java..

1 голос
/ 07 мая 2010

Нет совпадения 1-1 между адресами IPv4 и IPv6 (ни между IP-адресами и устройствами), поэтому то, что вы запрашиваете, обычно невозможно.

Существует определенный диапазон адресов IPv6, которые фактически представляют адресное пространство IPv4, но общие адреса IPv6 не будут из этого диапазона.

...