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 IPv4
met 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);