La Conversion de l'IPv6 à long et long terme pour IPv6
Comment dois-je effectuer la conversion depuis l'IPv6 à long et vice versa?
Pour l'instant j'ai:
public static long IPToLong(String addr) {
String[] addrArray = addr.split("\\.");
long num = 0;
for (int i = 0; i < addrArray.length; i++) {
int power = 3 - i;
num += ((Integer.parseInt(addrArray[i], 16) % 256 * Math.pow(256, power)));
}
return num;
}
public static String longToIP(long ip) {
return ((ip >> 24) & 0xFF) + "."
+ ((ip >> 16) & 0xFF) + "."
+ ((ip >> 8) & 0xFF) + "."
+ (ip & 0xFF);
}
Est-ce la bonne solution ou j'ai raté quelque chose?
(Il serait parfait si la solution a fonctionné pour ipv4 et ipv6)
OriginalL'auteur Testeross | 2013-07-26
Vous devez vous connecter pour publier un commentaire.
Une adresse IPv6 est un nombre de 128 bits comme décrit ici. Une longue Java est représenté sur 64 bits, si vous avez besoin d'une autre structure, comme un BigDecimal ou deux longs (un récipient avec un tableau de deux longs ou tout simplement un tableau de deux longs) pour stocker une adresse IPv6.
Ci-dessous est un exemple (juste pour vous donner une idée):
}
Il est assez facile à tester: exécuter longToIP(IPToLong("122.122.122.124")) et vous obtiendrez "34.34.34.36" au lieu de l'original "122.122.122.124", ce qui signifie quelque chose n'est pas correct.
Vous avez raison. Avez-vous une idée de ce qui est mal?
Le problème est le suivant: vous avez essayé d'adapter le code pour l'IPv4 à l'IPv6, ce qui est incorrect, parce qu'en IPv4, les chiffres sont codés en base 10 (le numéro 124 de l'adresse IP "122.122.122.124" est en base 10), mais en IPv6, toutes les pièces sont codées en hexadécimal. Cela signifie, que vous aurez à décider en quelque sorte la version de l'adresse IP, puis à prendre des décisions, afin d'avoir une méthode pour les deux versions.
Ajout d'un morceau de code de travail, mais ne l'esprit qu'il manque quelques vérifications (comme la Chaîne non valide), donc c'est ok pour vos devoirs, mais n'est pas suffisamment testés pour la production.
OriginalL'auteur Andrei I
Vous pouvez également utiliser java.net.InetAddress
Il fonctionne à la fois en ipv4 et ipv6 (tous les formats)
Merci pour le commentaire. Réponse de mise à jour.
OriginalL'auteur Guigoz
Une adresse IPv6 ne peuvent pas être stockées dans de long. Vous pouvez utiliser BigInteger au lieu de long.
OriginalL'auteur Vinod
Vinod la réponse est juste. Mais il y a encore certaines choses qui peuvent être améliorées.(Désolé je ne peux pas ajouter un commentaire ci-dessous Vinod de répondre parce que je suis nouveau ici.)
Tout d'abord, dans la méthode 'countChar', 'continuer' doit être remplacé par "pause".
Et deuxièmement, des conditions aux limites doivent être considérés.
OriginalL'auteur gaofc