Transformer une adresse ip donnée en binaire avec python

Résolu
Liloux -  
mamiemando Messages postés 33768 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

J'ai une fonction à faire en NSI avec python :

Voici la consigne et je n'y arrive pas du tout.

Écrire une fonction qui prend en paramètre une IP sous la forme d'une chaîne de caractères et qui renvoie sa conversion en binaire sans les points de séparation.

Par exemple,
ip_vers_ip_binaire('192.168.0.1')
vaut
'11000000101010000000000000000001'
.

Attention ! Une adresse IP est codée sur 32 bits, soit 4 fois 8 bits. Ainsi par exemple 1 sur 1 octet doit être converti en 00000001


Si vous savez comment faire, n'hésitez pas.

Merci beaucoup !

7 réponses

magouero Messages postés 242 Date d'inscription   Statut Membre Dernière intervention   66
 
Bonjour,

A mon avis tu commence par séparer l'adresse 192.168 ... en un tableau de 4 trucs qui sont en 8bits
puis tu écris les 4 nombres les uns après les autres sans rien entre

Donc il te faut la fonction qui découpe avec un séparateur qui est le point "." et qui te sort les 4 nombres.

Puis un print avec un format binaire en 8 bits.
A mon avis il y a tout cela dans la doc python.
Fais y ton marché :)

https://overapi.com/python
Indices:
il existe les fonctions:
str.split()
int()
bin()

1
Liloux
 
Merci beaucoup pour vos indications je m'y met et si je trouve je vous envoie, merci encore !
0
magouero Messages postés 242 Date d'inscription   Statut Membre Dernière intervention   66 > Liloux
 
moi j'ai trouvé :)

plutot que bin() il y a format(machin,truc)
1
Liloux > magouero Messages postés 242 Date d'inscription   Statut Membre Dernière intervention  
 
ahh oui c'est vrai merci
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
0
Liloux
 
Bonjour,

Je ne cherche pas la réponse juste de l'aide.
J'ai déjà commencé avec ça:

def convertir(T):
    """
    T est un tableau d'entiers, dont les éléments sont 0 ou 1 et
    représentant un entier écrit en binaire.
    Renvoie l'entier positif dont la représentation binaire
    est donnée par le tableau T
    """
    n = len(T)
    dec_int = 0 # Initialisation de l'entier decimal dont o a la représentation binaire
    for k in range(n):
        dec_int = dec_int + T[k] * 2 ** (n - 1 - k)
    return dec_int 


Sauf que si je le passe en
str
le calcul ne se fait pas et j'ai une erreur.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Liloux
 
bonjour,
peux-tu utiliser les balises de code quand tu partages du code: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

peux-tu montrer comment tu appelles ta fonction?
ta fonction fonctionne bien?
0
Liloux > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
 def convertir(T)
    """
    T est un tableau d'entiers, dont les éléments sont 0 ou 1 et
    représentant un entier écrit en binaire.
    Renvoie l'entier positif dont la représentation binaire
    est donnée par le tableau T
    """
    n = len(T)
    dec_int = 0 #initialisation de l'entier decimal dont o a la représentation binaire
    for k in range(n):
        dec_int=dec_int+T[k]*2**(n-1-k)
    return dec_int 
0
Liloux > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Ma fonction fonctionne bien mais je crois qu'elle ne m'aide pas du tout car elle transforme le binaire en décimal et il faut faire l'inverse.
De ce que j'ai compris il faut donc que je prenne ma donnée comme le '192', que ne la transforme en binaire en rajoutant des 0 si il le faut puis que je " colle" les données pour faire un long binaire correspondant à chaque parties
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Liloux
 
je pense aussi.
1
mamiemando Messages postés 33768 Date d'inscription   Statut Modérateur Dernière intervention   7 878
 
Bonjour,

Par rapport au message #4, quelques précisions.
  • Il faut en effet séparer ton adresse IPv4 en 4 entiers. Chacun de ces entiers vaut entre 0 et 255 et donc tient sur un octet (soit 4 entiers de 8 bits chacun, et donc une IPv4 correspond bien à 4 * 8 = 32 bits). Pour cela tu peux utiliser la méthode
    split()
    .


Exemple :

(x, y, z, t) = adresse_ip.split(".")
  • Tu peux convertir une chaîne de caractère qui contient un entier (e.g.,
    "192"
    ) en entier avec la fonction
    int()
    .


Exemple :

i = int("192")
  • Pour chacun de ces 4 entiers, il tu peux le représenter sous forme binaire avec la fonction
    bin()
    . Exemple :
    bin(192)
    . Mais tu verras que la chaîne retournée est préfixée par
    "0b"
    . Si tu veux supprimer ce préfixe, il suffit de considérer la représentation binaire ainsi obtenue à partir du second caractère.


Exemple :

b = bin(192)[2:]
  • En concaténant ces quatre chaînes tu obtiendras la représentation binaire de ton adresse IP.


Bonne chance
0
magouero Messages postés 242 Date d'inscription   Statut Membre Dernière intervention   66
 
Alors , trouvé ? :)

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Liloux
 
 Oui ! j'ai fait plusieurs fonctions pour ne pas avec ma fonction principale (ip_vers_ip_binaire(ip) ) trop grande 

 

def decimal_en_binaire(a):
    """a est un entier positif en base 10
    Renvoie sa valeur convertie en base 2 
    sous la forme d'une chaine de caractères
    """
    bin_a = str(a%2) # Initialisation du mot binaire
    a = a // 2
    while a!=0 :
        bin_a = str(a % 2) + bin_a
        a = a//2
    return bin_a

def ip_vers_liste(ip):
    """ip est une adresse ipv4 de type str
    Renvoie le tableau des octets (en décimal de type int)
    """
    tab_str = ip.split('.')
    tab_int= [int(k) for k in tab_str] #création du tableau qui convertir tab_str(type str) en entier (type int)
    return tab_int 

def ip_vers_ip_binaire(ip):
    """ip est une adresse ipv4 de type str
    Renvoie l'ip en convertissant les octets en binaire et sans les points de séparation. 
    L'ip renvoyée est de type str
    """
    ip =ip_vers_liste(ip) #transformation d'une chaîne de caractères en liste 
    n = len(ip)
    binn1='' # binn1 est une chaîne de caractères
    manque= '0' #manque sert à rajouter des 0 pour arriver à 8bits pour chacunes des  4 parties de l'IP
    binn= '0' 
    for i in range(4):
        binn= decimal_en_binaire(ip[i])
        if len(binn)!=8: 
            binn = manque*(8-len(binn))+ binn
        binn1= binn1 + binn
    
    return binn1 
0
magouero Messages postés 242 Date d'inscription   Statut Membre Dernière intervention   66
 
Moi j'avais:

adresseIp = "192.168.0.1"  # l'adresse qu'on veut traiter
print(adresseIp)  # juste pour debug

def ipEnBinaire (adresseIp):
    toto = adresseIp.split('.')
    resultat = ""    # init de resultat pour avoir format chaine
    for compteur in toto:
        #print(compteur)  # juste pour debug
        resultat = resultat+format(int(compteur),'08b')
    
    print(resultat)
    return 0

#lance l'action
ipEnBinaire(adresseIp) 
 
0
Liloux
 
Ah oui il est nettement plus court que le miens et ne nécessite qu'une fonction bien joué et merci !
0
mamiemando Messages postés 33768 Date d'inscription   Statut Modérateur Dernière intervention   7 878
 
Bonjour,

Tu peux faire plus court notamment en utilisant cette astuce :

def ip_vers_ip_binaire(ipv4):
    return "".join(
        "{0:08b}".format(int(n)) 
        for n in ipv4.split(".")
    )

print(ip_vers_ip_binaire("192.168.0.1"))


Bonne chance
0
magouero Messages postés 242 Date d'inscription   Statut Membre Dernière intervention   66
 
Bonjour mamie,

pouvez vous expliquer l'usage de FOR dans votre exemple. Je ne comprends pas ce que la partie dans le join i.e.:
"{0:08b}".format(int(n))  
for n in ipv4.split(".")


fait devant le for.
Pour moi le for ne renvoie rien puisqu'il n'est suivi d'aucune instruction.
Et la doc python 3.10.3 indique §8.3 pour FOR:
"for_stmt ::= "for" target_list "in" expression_list ":" suite
["else" ":" suite]"

il semble que le ":" ne soit pas facultatif donc déjà je ne comprends pas pour cela ne sort pas une erreur mais bon, admettons. Et on n'a rien pour suite donc pas d'action.

si on simplifie en
 n for n in ipv4.split(".")

Ca fonctionne et sort 19216801 , logique.

Mais comment ? Pouvez vous expliquer ou renvoyer vers un § de la doc qui me permette de comprendre ?

Merci d'avance.
0
mamiemando Messages postés 33768 Date d'inscription   Statut Modérateur Dernière intervention   7 878 > magouero Messages postés 242 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour magouero,

Ce qui te bloque c'est probablement que tu ne connais pas encore la syntaxe des boucles
for
utilisée dans les comprehensions de listes.

Cette syntaxe s'applique pour une
list
, un
tuple
, un
dict
, un générateur.

En toute rigueur d'ailleurs, il s'agit plutôt de la syntaxe associée à un générateur qui est passé au constructeur
list
, un
tuple
,
dict
.

Dans la syntaxe que tu connais déjà, la fonction que j'ai indiquée se réécrit :

def ip_vers_ip_binaire(ipv4):
    ma_liste = list()
    for n in ipv4.split("."):
        ma_liste.append("{0:08b}".format(int(n)))
    return "".join(ma_liste)


"{0:08b}".format(int(n))
signifie "écrit l'entier
n
au format binaire sur au plus 8 caractères en ajoutant les éventuels 0 à gauche manquants pour obtenir 8 caractères"
. Plus de détails, voir ce lien.

Bonne chance
1
magouero Messages postés 242 Date d'inscription   Statut Membre Dernière intervention   66 > mamiemando Messages postés 33768 Date d'inscription   Statut Modérateur Dernière intervention  
 
ok je vois. Pour le format et le padding , je l'avais.

Mais punaise pour trouver ça dans la doc sans savoir comment ça s'appelle ...


Alors pour ceux qui liraient cette discussion:
regardez
https://docs.python.org/3/tutorial/controlflow.html
puis: "generator expression"
https://docs.python.org/3/glossary.html#term-generator

Pour les exemples et l'intérêt de la méthode, le lien "generateur" ci dessus est très bon.

Merci Mamiemando.
0
mamiemando Messages postés 33768 Date d'inscription   Statut Modérateur Dernière intervention   7 878 > magouero Messages postés 242 Date d'inscription   Statut Membre Dernière intervention  
 
Mais punaise pour trouver ça dans la doc sans savoir comment ça s'appelle ...

Oui, oui, je sais, mais tu vas me faire rougir :D Bon, en vrai je n'ai pas de mérite à part avoir su chercher correctement ;-)

Merci Mamiemando.

De rien, bonne continuation :-)
0