IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

conversion d'entiers vers un type BYTE


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2017
    Messages : 5
    Par défaut conversion d'entiers vers un type BYTE
    Bonjour,

    Débutant en Python, je me retrouve confronté à un problème de conversions de types.
    J'implémente un protocole de communication sur liaison série (UART), et dans ce contexte je souhaiterais convertir des entiers vers le type BYTE (qui est le type utilisé pour communiquer sur liaison série avec la bibliothèque serial).

    Je ne comprends pas bien la cohérence du fonctionnement de la fonction BYTE() : si je convertis l'entier 15, par exemple, la fonction me renvoie b'x0f' (donc l'octet en notation hexadecimal). Par contre si je convertis l'entier 66, la fonction me renvoie b'B' (donc l'octet au format ascii, vraisemblablement).
    Existe-t-il une fonction pour maîtriser la conversion des données vers le type byte (je souhaiterais obtenir b'x42' quand je lui passe 66 en entrée, en gros) ?
    J'imagine qu'implémenter une fonction ne doit pas être trop compliqué, mais je souhaitais m'assurer qu'il n'existe pas de fonctions "Python" qui fasse le job.

    D'avance merci

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 695
    Par défaut
    Salut,

    Citation Envoyé par floLD Voir le message
    Je ne comprends pas bien la cohérence du fonctionnement de la fonction BYTE() : si je convertis l'entier 15, par exemple, la fonction me renvoie b'x0f' (donc l'octet en notation hexadecimal). Par contre si je convertis l'entier 66, la fonction me renvoie b'B' (donc l'octet au format ascii, vraisemblablement).
    La fonction BYTES() n'est pas standard... et si on ne sait pas trop ce que vous utilisez. Poster un exemple avec l'import de la bibliothèque utilisée et d'utilisation de la fonction...

    Existe-t-il une fonction pour maîtriser la conversion des données vers le type byte (je souhaiterais obtenir b'x42' quand je lui passe 66 en entrée, en gros) ?
    Avec Python3, vous avez la class bytes qui permet de faire ce genre de conversion. La bibliothèque serial vient avec une fonction serial.to_bytes qui est compatible Python2/3.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2017
    Messages : 5
    Par défaut
    Merci pour la réponse !

    J'utilisais la fonctions bytes() qui semble être une fonction "native". Le résultat est le même avec la fonction serial.to_bytes() :

    Nom : [Python 3.x] conversion d'entiers vers un type BYTE.png
Affichages : 1313
Taille : 10,8 Ko

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 695
    Par défaut
    Salut,

    Cà fait le boulot mais "par défaut", çà ne l'affiche pas comme vous le voulez.
    Une solution parmi d'autres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> s = b'foo'
    >>> import binascii
    >>> binascii.hexlify(s)
    b'666f6f'
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2017
    Messages : 5
    Par défaut
    Oui, voilà, mon problématique concerne effectivement l'affichage de mes données (je voudrais afficher pour l'utilisateur les données envoyées, sous forme d'hexa pour rester cohérent).
    Votre solution semble bien faire le job.

    Merci.

    Citation Envoyé par wiztricks Voir le message
    Salut,

    Cà fait le boulot mais "par défaut", çà ne l'affiche pas comme vous le voulez.
    Une solution parmi d'autres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> s = b'foo'
    >>> import binascii
    >>> binascii.hexlify(s)
    b'666f6f'
    >>>
    - W

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    Billets dans le blog
    1
    Par défaut
    Je ne comprends pas bien la cohérence du fonctionnement de la fonction BYTE() : si je convertis l'entier 15, par exemple, la fonction me renvoie b'x0f' (donc l'octet en notation hexadecimal). Par contre si je convertis l'entier 66, la fonction me renvoie b'B' (donc l'octet au format ascii, vraisemblablement).
    Il ne faut pas trop se poser de question sur la représentation par __str__ ou __repr__ d'un objet bytes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> bytes("bonjour", "utf-8")
    b'bonjour'
     
    >>> bytes(3)
    b'\x00\x00\x00'
     
    >>> bytes([65, 15])
    b'A\x0f'
    En gros, ça t'affiche le tableau byte par byte en transformant chaque byte :
    - si la valeur correspondant à un caractère affichable ASCII, alors on voit ce caractère (ici, "bonjour" qui devient 'bonjour' et 65 qui devient 'A')
    - si la valeur correspond à un caractère ASCII non affichable, alors on voit son code en hexa (ici, 0 qui devient '\x00' et 15 qui devient '\x0F').

    Existe-t-il une fonction pour maîtriser la conversion des données vers le type byte (je souhaiterais obtenir b'x42' quand je lui passe 66 en entrée, en gros) ?
    Non ! 66 est un caractère affichable. Il ne faut pas oublier que ça reste une représentation textuelle d'un tableau de bytes. Pour s'en convaincre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> b = bytes([66, 66])
    >>> b
    b'BB'
    >>> int.from_bytes(b, byteorder='little')
    16962
    >>> 0xBB
    187

    Si tu veux une chaine de caractères donnant la représentation hexadécimale d'un nombre, ce n'est pas un bytes() qu'il te faut, mais hex().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    >>> help(hex)
    Help on built-in function hex in module builtins:
     
    hex(number, /)
        Return the hexadecimal representation of an integer.
     
        >>> hex(12648430)
        '0xc0ffee'
     
    >>> hex(66)
    '0x42'
    >>> type(hex(66))
    <class 'str'>
    >>> type(bytes([66]))
    <class 'bytes'>

Discussions similaires

  1. Conversion d'entier vers QString, zéro devant
    Par alyma dans le forum Débuter
    Réponses: 2
    Dernier message: 28/11/2013, 09h13
  2. Conversion entier vers chaine formatée
    Par mikaelm dans le forum Ruby
    Réponses: 2
    Dernier message: 19/06/2008, 13h43
  3. Réponses: 15
    Dernier message: 16/08/2007, 11h47
  4. Conversion Entier vers Caractère.
    Par -= Cobra =- dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/12/2006, 11h05
  5. conversion entier vers chaine de caratères
    Par naima2005 dans le forum C++
    Réponses: 3
    Dernier message: 20/08/2006, 02h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo