Partage
  • Partager sur Facebook
  • Partager sur Twitter

Télécommunications avec Python (chgmt de base)

Sujet résolu
28 juillet 2021 à 11:37:45

Bonjour,

Je travaille actuellement sur le sujet des télécommunications. Je n'arrive pas à trouver de module qui me permette de convertir un message alphanumérique en binaire, puis d'y apporter des modifications. Il me faudrait faire des calculs en binaire (division euclidienne, concaténation) et de passer d'une base à l'autre. J'avais trouvé la méthode 'usuelle', mais il faut utiliser plusieurs méthodes juste pour convertir un message en binaire, j'ai beaucoup de mal à poursuivre mon projet de cette façon.

Python est très utilisé, même par les professionnels, j'imagine donc qu'il existe un module qui permette de changer de base et d'effectuer des calculs aisément. Pouvez-vous m'aider ?

Merci

  • Partager sur Facebook
  • Partager sur Twitter
28 juillet 2021 à 12:20:06

Un nombre n'a pas de base, seul sa représentation en a !

Python considère des types, (str, int, list, etc) mais la données manipulée reste une simple chaîne d'octets.

Vous devez changez le type de la donnée pour y faire les manipulations souhaitées : data = bytes(text, encoding="UTF-8")

  • Partager sur Facebook
  • Partager sur Twitter
28 juillet 2021 à 16:07:10

Merci,

J'ai justement beaucoup de mal à faire des codes avec ceci. En cherchant un peu à partir de votre message j'ai trouvé un embryon de code que j'ai un peu modifié pour obtenir ce que je veux

def tobinary(string) : 
    objbytearray = bytearray(string, "utf8")        #crée un objet bytes de travail
    bytelist = []
    binstring = ''

    for byte in objbytearray : 
        binaire = bin(byte)
        bytelist.append(binaire)                    #donne une liste de chaque caractère en binaire 
    
    for e in range(len(bytelist)) :                 
        bytelist[e] = bytelist[e][2:]               #supprime les préfixes '0b'
    
    for e in range(len(bytelist)) : 
        binstring += bytelist[e]                    #forme une seule string de binaires
    
    
    return binstring                                #Prends uniquement des strings en argument : les entiers donnent un mauvais résultat

a = 'bonjour'
print(tobinary(a))

J'ai mis cette fonction au point pour aller plus vite par la suite. Elle fonctionne plutôt bien. Avec l'exemple ci-dessus, le message rentré 'bonjour' est transformé en '1100010110111111011101101010110111111101011110010'. Chaque caractère est représenté par 7 bits. Seulement, cela implique que les chiffres aussi son représentés par 7 bits, et ça m'embête un peu que la représentation binaire de '2' par ma fonction soit '110010'.

Je dois pouvoir me débrouiller avec une nouvelle fonction pour convertir les chiffres mais à vrai dire, c'est pour ça que je me demandais s'il n'y avait pas un module exprès, j'imagine que je ne suis pas le premier.

-
Edité par Archerlite 28 juillet 2021 à 16:07:47

  • Partager sur Facebook
  • Partager sur Twitter
28 juillet 2021 à 17:58:08

il faut passer par format() à la place de bin()

ligne7: binaire=format(byte,'#010b') => '0b00110010' (10 caractères pour afficher l'octet (avec le 0b)

ou binaire=format(byte,'08b') => '00110010' (8 caractères sans le 0b)

si tu ne veux voir que 7 caractères (bit) par valeur, remplace 010 par 09, ou 08 par 07 selon ton souhait

En fait, bin va tronquer les 0 devant, ainsi le caractère espace sera représenté par '100000' (0x20) soit 6 caractères , comme tes chiffres en fait (0x31 à 0x39)

-
Edité par umfred 28 juillet 2021 à 18:00:04

  • Partager sur Facebook
  • Partager sur Twitter
28 juillet 2021 à 18:45:40

Il est aussi possible de considérer la chaîne comme un seul grand nombre :
s = "bonjour"
d = s.encode()
n = int.from_bytes(d, "big")
print(bin(n))
  • Partager sur Facebook
  • Partager sur Twitter
28 juillet 2021 à 18:54:30

il reste toujours le problème des zéros d'entêtes (leadings zeros) pour avoir un affichage '0110010' sur 7 caractères par exemple (bin() les enlève)
  • Partager sur Facebook
  • Partager sur Twitter
28 juillet 2021 à 20:09:24

Merci encore.

Toutefois le résultat obtenu est une string, qui n'est composée que de 0 et de 1. Je ne vais donc pas pouvoir effectuer des calculs avec. Qui plus est, ce qui est étrange, c'est que j'obtiens malgré tout une string lorsque je modifie la fin de mon code de cette façon :

binaire = bin(int(binstring))
    return binaire 

où binstring est une chaine obtenue par la méthode format et le programme présenté plus haut.

Suis-je obligé de conserver le format string, et donc de trouver des artifices pour effectuer mes opérations (auquel cas je ne vois pas comment) ?



  • Partager sur Facebook
  • Partager sur Twitter
28 juillet 2021 à 20:23:54

Oui, une chaîne de bits ne se représente que sous la forme d'une chaîne de caractères... Utilisez des types numériques pour faire vos calcules, puis représentez-les comme bon vous semble.
  • Partager sur Facebook
  • Partager sur Twitter
29 juillet 2021 à 10:31:33

si ce que tu reçois est une chaine représentant un nombre ('54' par exemple) et que tu veux travailler sur le nombre lui même (54) alors passe par la fonction int('54') qui te transformera ta chaine '54' en entier 54 (ou float('54') pour avoir un flottant 54.0)

Si ta chaine mélange caractères alpha et numérique, il faudra les séparer bien évidemment

  • Partager sur Facebook
  • Partager sur Twitter