2013-08-02 7 views
0

a de bonnes idées pour comparer deux adresses ipv6. On dirait que les règles de pénurie compliquent la situation.Comparer les adresses IP v6

par exemple l'adresse complète 1234: 0db8: 0000: 0000: 0000: ff00: ff00: 0011

  1. zéro peut être retiré => 1234: 0db8 :::: ff00: FF00: 11
  2. un groupe de champs vides peut être supprimé 1234: 0db8 :: ff00: ff00: 00111
  3. 32 dernier bit peut être une ancienne adresse ipv4 1234: 0db8 :::: ff00: 172.0.0.15
+2

* Normaliser * les soit dans leur plus compact formulaire ou leur forme complète avant comparaison ... – deceze

+0

L'étape 1 est erronée. Il devrait être '1234: 0db8: 0: 0: 0: ff00: ff00: 11'. Bien que techniquement correct, un seul '0 'ne mène plus, car il n'y a rien qu'il pourrait conduire. Sinon, '1234: 0000: 0000: 4321: 0000: 0000: 0000: 0001' pourrait être converti en' 1234 ::: 4321 :::: 1 ', ce qui est clairement faux. – glglgl

Répondre

0

Vous pourriez juste le diviser par deux-points, puis comparez chaque valeur. Si vous rencontrez un champ vide -> insérer '0000' pour cela. Si vous rencontrez un champ avec moins de 4 chiffres -> le remplir avec des zéros

De plus, vous pouvez donner un poids à chacun des champs pour souligner les valeurs des champs.

2

Vous pouvez utiliser la fonction de bibliothèque standard socket.inet_pton pour convertir les adresses en une chaîne d'octets pour la comparaison:

>>> socket.inet_pton(socket.AF_INET6,'1234:0db8::ff00:ff00:0011') 
'\x124\r\xb8\x00\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x11' 
>>> socket.inet_pton(socket.AF_INET6,'1234:0db8:0000:0000:0000:ff00:ff00:0011') 
'\x124\r\xb8\x00\x00\x00\x00\x00\x00\xff\x00\xff\x00\x00\x11' 

Cela permettra de réduire le risque de vous créer votre propre bug IPv6.


exemple ci-dessus est en python, mais la fonction inet_pton est disponible sur différentes plates-formes et langues:

Questions connexes