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 octets en utf8


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 12
    Points : 9
    Points
    9
    Par défaut conversion octets en utf8
    Bonsoir,
    je travaille sous Python 3.3.
    J'ai une chaîne d'octets à transmettre via liaison série (Pyserial).
    J'utilise donc la méthode serial.write(('\x00\x13\xA2\x00\x40.....').encode('utf8'))
    Sur un terminal,je reçois la trame sauf que pour l'octet xA2, il me l'affiche sur 2 octets: C2 A2.

    Comment faire pour éviter ce problème? Je n'arrive pas à m'en sortir.
    Merci d'avance.

  2. #2
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Diable, mais pourquoi donc encoder en utf8*???

    D’abord, c’est normal que certaines valeurs soient encodées sur deux octets (ou même plus), utf8 est un codec “multi-bytes”.

    Mais en ce qui vous concerne, je crois que le plus simple, et de loin, est d’utiliser directement un objet bytes, en ajoutant tout simplement un petit “b”*: serial.write(b'\x00\x13\xA2\x00\x40.....').

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 114
    Points : 129
    Points
    129
    Par défaut
    Bonjour

    Je pense avoir un problème similaire mais avec des sockets, que j'ai résolu comme ceci :

    Donc j'ai une chaîne de caractère, par exemple
    s = "toto"

    A savoir qu'en python 3, elle est nativement en unicode.

    Pour envoyer cette chaîne de caractère par socket, je dois faire ceci :
    socket.send( s.encode() )

    De l'autre coté, je réceptionne ce message comme ceci :

    raw = soccket.recv()

    raw est alors un tableau de byte, ce qui n'est pas encore une chaîne de caractère python propre.
    Je fais la conversion comme ceci :

    chaine = bytes.decode(raw)


    Cordialement
    Emmanuel

  4. #4
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    @Emmanuel oui, mais vous souhaitez transmettre du texte, alors qu’a priori, moumoute, lui, veut transmettre des données (en tout cas, j’espère, parce qu’avec deux octets NULL dans les quatre premiers… ). Donc quitte à les fournir en hexa, autant le faire directement dans un bytes, ça évite tout besoin de conversion.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 12
    Points : 9
    Points
    9
    Par défaut conversion octets en utf8
    Merci beaucoup pour vos réponses ; je teste cet après-midi ou ce soir au pire et je vous tiens informé.

    C'est super sympa d'avoir de l'aide!!!!

    Cordialement

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 12
    Points : 9
    Points
    9
    Par défaut conversion entier en octet
    Bonsoir

    Merci pour la réponse concernant l'octet \x42 qui me posait problème.
    Effectivement, en mettant b'\x42, cela fonctionne très bien.

    J'ai un autre souci; suite à un calcul de checksum en décimal, je souhaite convertir cet entier en octet pour le rajouter à la fin de ma trame d'octets.

    J'ai bien vu la fonction hexmais en faisant hex(66) par exemple, cela donne 0x42.
    Je regarde avec bytes() mais ça ne donne pas le résultat.

    Y a -t-il une fonction toute faite appropriée qui me convertisse 66 (entier) en octet b'\x42 ?

    Merci d'avance
    Cordialement

  7. #7
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Pour convertir un entier [0, 255] en bytes, le plus simple est d’utiliser le constructeur de celui-ci, en lui passant une liste de un élément, par exemple bytes([66]) génère l’octet b'B'.

    Donc dans ton cas, quelque chose du genre*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    serial.write(b'\x00\x13\xA2\x00\x40.....' + bytes([my_checksum]))
    Attention à bien passer l’unique valeur sous forme d’iterable, si on lui passe directement un entier, cette andouille de bytes() génère une chaîne d’octets NULL de longueur correspondante*!

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 12
    Points : 9
    Points
    9
    Par défaut conversion entier en octet
    Bonjour

    Merci pour cette réponse qui fonctionne à merveille.
    Je regarderai + attentivement le bytes() qui a besoin d'une liste d'entiers et non d'un entier tout seul ...bizarre mais bon.

    Bonne continuation et je vous solliciterai certainement bientôt car l'aventure continue

    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Script Taille conversion octet giga méga
    Par Lexounet dans le forum VBScript
    Réponses: 14
    Dernier message: 24/05/2011, 11h23
  2. Réponses: 1
    Dernier message: 18/08/2010, 11h55
  3. Conversion octets en Ko et Mo !
    Par cincap dans le forum Débuter
    Réponses: 2
    Dernier message: 07/03/2009, 12h50
  4. Conversion we8iso8859p9 en UTF8
    Par awatif dans le forum Administration
    Réponses: 0
    Dernier message: 09/11/2008, 13h53
  5. [HTML] conversion html à txt-utf8
    Par mimokatana dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 19/10/2006, 18h25

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