analyse adresse IP#
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_v1
v0#
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]
True
v1#
Même analyse, mais le retour est un entier dans l’espace \([0..2^{32}-1]\)
Si j’appelle \(b_0\), \(b_1\), \(b_2\), \(b_3\) les 4 valeurs retournées par ip_v0, le résultat ici sera obtenu avec la formule
\(I = b_0.2^{24} + b_1*2^{16} + b_2*2^8 + b_3\)
# doit retourner True
ip_v1(IP_1) == 0xc0a80009
True
# doit retourner True
ip_v1(IP_2) == 0x8a601301
True
astuce#
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
0xc0a80009
3232235529
solution#
ouvrez-moi
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