le problème¶
Une adresse IP v4 se présente sous la forme d’une chaine contenant 4 octets (de 0 a 255 donc) en décimal séparés par des .
# exemples
IP_1 = "192.168.0.9"
IP_2 = "138.96.19.1"from ipsplit import ip_v0, ip_v1v0¶
On vous demande d’écrire une fonction qui transforme cette donnée (une chaine donc) en une liste de 4 entiers
# remarquez bien l'absence de quotes (') dans le résultat
ip_v0(IP_1)[192, 168, 0, 9]# doit retourner True
ip_v0(IP_1) == [192, 168, 0, 9]True# doit retourner True
ip_v0(IP_2) == [138, 96, 19, 1]Truev1¶
Même analyse, mais le retour est un entier dans l’espace
Si j’appelle , , , les 4 valeurs retournées par ip_v0, le résultat ici sera obtenu avec la formule
# doit retourner True
ip_v1(IP_1) == 0xc0a80009True# doit retourner True
ip_v1(IP_2) == 0x8a601301Trueastuce¶
Comment faire ces calculs facilement de manière interactive ?
# les différents morceaux de ip_v0 valent ceci
hex(192), hex(168), hex(0), hex(9)('0xc0', '0xa8', '0x0', '0x9')# ça veut dire que le résultat final doit être ceci
0xc0a800093232235529solution¶
ouvrez-moi
ipsplit.py
def ip_v0(ip):
"""
Convertit une adresse IP en une liste de 4 entiers
"""
# pour commencer on fait un split('.')
# qui nous retourne une liste de chaines
# et sur chacune de ces chaines on applique
# la fonction 'int()' pour convertir en entier
return [int(x) for x in ip.split('.')]
def ip_v1(ip):
"""
Convertit une adresse IP en un entier sur 32 bits
"""
# on s'appuie sur la première version
bytes = ip_v0(ip)
# ne reste plus quà faire un peu d'arithmétique
result = 0
while bytes:
result = result * 256 + bytes.pop(0)
return result