Hoe kan ik een IPV6-adres converteren naar een IPV4-adres?

Ik heb een applicatie die IPv4-adressen gebruikt (het slaat ze zo lang op), dus het begrijpt alleen IPv4-adressen.

Is het mogelijk om het IPv6-adres om te zetten naar IPv4met Java?


Antwoord 1, autoriteit 100%

Hoewel er zijn IPv6-equivalenten voor het IPv4-adresbereik, kunt u converteer niet alle IPv6-adressen naar IPv4 – er zijn meer IPv6-adressen dan er IPv4-adressen zijn.

De enige verstandige manier om dit probleem te omzeilen, is door uw toepassing bij te werken om IPv6-adressen te begrijpen en op te slaan.


Antwoord 2, autoriteit 30%

De IPAddress Java-bibliotheekkan bereiken wat u hier beschrijft.

IPv6-adressen zijn 16 bytes. Als u die bibliotheek gebruikt, kunt u, als u begint met een array van 16 bytes, het IPv6-adresobject construeren:

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

Vanaf daar kun je controleren of het adres IPv4 is toegewezen, IPv4-compatibel, IPv4 vertaald, enzovoort (er zijn veel mogelijke manieren waarop IPv6 IPv4-adressen vertegenwoordigt). In de meeste gevallen, als een IPv6-adres een IPv4-adres vertegenwoordigt, bevindt het ipv4-adres zich in de onderste 4 bytes, en dus kunt u het afgeleide IPv4-adres als volgt verkrijgen. Daarna kunt u het terug converteren naar bytes, wat slechts 4 bytes zal zijn voor IPv4.

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

De javadoc is beschikbaar via de link.


Antwoord 3, autoriteit 26%

Hier is de code die u zoekt in javascript. Nou, je weet dat je niet alle ipv6-adressen kunt converteren

<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>

Antwoord 4, autoriteit 17%

Er is geen 1-1 correspondentie tussen IPv4- en IPv6-adressen (noch tussen IP-adressen en apparaten), dus waar u om vraagt is over het algemeen niet mogelijk.

Er is een bepaald bereik van IPv6-adressen die feitelijk de IPv4-adresruimte vertegenwoordigen, maar algemene IPv6-adressen zullen niet uit dit bereik vallen.


Antwoord 5, autoriteit 9%

Enig googlen leidde me naar het volgende bericht:

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

De code in het bericht is in C, maar het zou niet al te moeilijk moeten zijn om het naar Java te herschrijven.


Antwoord 6

Vishnuraj V’s berichtheeft mijn probleem ook opgelost. Bedankt daarvoor!

Ik heb de functies omgezet in één functie en vaste een paar kleine bugs op:
jsfiddle

HTML:

<div id="ipAddress">
</div>

JS:

/* Convert IPv6 address to IPv4 address */
/* Fork from: https://stackoverflow.com/a/23147817/11404332 */
function IP6to4(ip6) {
    function parseIp6(ip6str) {
        const str = ip6str.toString();
        // Initialize
        const ar = new Array();
        for (var i = 0; i < 8; i++) ar[i] = 0;
        // Check for trivial IPs
        if (str == '::') return ar;
        // Parse
        const sar = str.split(':');
        let slen = sar.length;
        if (slen > 8) slen = 8;
        let j = 0;
        i = 0
        for (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;
    }
    var ip6parsed = parseIp6(ip6);
    const ip4 = `${ip6parsed[6] >> 8}.${ip6parsed[6] & 0xff}.${ip6parsed[7] >> 8}.${ip6parsed[7] & 0xff}`;
    return ip4;
}
/* Usage */
const ipAddress = '0:0:0:0:0:FFFF:7F00:0001';
document.getElementById("ipAddress").innerText = IP6to4(ipAddress);

Other episodes