web-dev-qa-db-fra.com

Comment puis-je convertir une adresse IPV6 en adresse IPV4?

J'ai une application qui utilise IPv4 adresses (il les stocke aussi longtemps), donc il ne comprend que IPv4 adresses.

Est-il possible de convertir IPv6 Adressé à IPv4 avec Java?

12
newbie

Alors que il existe des équivalents IPv6 pour la plage d'adresses IPv4 , vous ne pouvez pas convertir toutes les adresses IPv6 en IPv4 - il y a plus d'adresses IPv6 que d'adresses IPv4.

La seule manière raisonnable de contourner ce problème est de mettre à jour votre application pour pouvoir comprendre et stocker les adresses IPv6.

17
AllenJB

L'adresse IP Java peut accomplir ce que vous décrivez ici.

Les adresses IPv6 font 16 octets. À l'aide de cette bibliothèque, si vous commencez avec un tableau de 16 octets, vous pouvez construire l'objet d'adresse IPv6:

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

De là, vous pouvez vérifier si l'adresse est mappée IPv4, compatible IPv4, traduite IPv4, etc. (il existe de nombreuses façons possibles pour IPv6 de représenter les adresses IPv4). Dans la plupart des cas, si une adresse IPv6 représente une adresse IPv4, l'adresse ipv4 est dans les 4 octets inférieurs, et vous pouvez donc obtenir l'adresse IPv4 dérivée comme suit. Ensuite, vous pouvez reconvertir en octets, qui ne seront que 4 octets pour IPv4.

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

Le javadoc est disponible sur le lien.

4
Sean F

Voici le code que vous recherchez en javascript. Eh bien, vous savez que vous ne pouvez pas convertir toutes les adresses 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>
2
Vishnuraj V

Il n'y a pas de correspondance 1-1 entre les adresses IPv4 et IPv6 (ni entre les adresses IP et les appareils), donc ce que vous demandez généralement n'est pas possible.

Il existe une plage d'adresses IPv6 particulière qui représente réellement l'espace d'adressage IPv4, mais les adresses IPv6 générales ne proviendront pas de cette plage.

Une recherche sur Google m'a conduit au poste suivant:

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

Le code fourni dans l'article est en C, mais il ne devrait pas être trop difficile de le réécrire en Java.

1
aioobe