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 :

Convertir une string contenant le caractère hexa '0xFF' en ASCII [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2017
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2017
    Messages : 16
    Par défaut Convertir une string contenant le caractère hexa '0xFF' en ASCII
    Bonjour à tous,

    Tout d'abord, j'utilise Python 3.8.2
    J'aimerai convertir une chaîne de caractère de l'hexa vers l'ASCII.
    La chaîne est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    4B 32 30 30 35 39 39 2D 31 32 41 20 FF FF FF FF FF FF FF FF 41 41 62 41 0A 31 39 39 39 30
    Si je copie cette chaîne dans le site internet http://www.rapidtables.com/convert/n...-to-ascii.html, j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    K200599-12A ÿÿÿÿÿÿÿÿAAbA
    19990
    J'ai pas mal cherché et sur internet, il y est écrit que les ligne suivante sont sensées fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    hex_string = "4B 32 30 30 35 39 39 2D 31 32 41 20 FF FF FF FF FF FF FF FF 41 41 62 41 0A 31 39 39 39 30"
    bytes.fromhex(hex_string).decode("ASCII")
    J'obtiens l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 12: ordinal not in range(128)
    J'ai également essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hex_string = "4B3230303539392D31324120FFFFFFFFFFFFFFFF414162410A3139393930"
    ou avec utf-8 à la place d'ASCII mais j'ai toujours une erreur.

    J'ai regardé des dizaines de forum sur la question du byte "0xFF" en ASCII ou UTF-8. A chaque fois, la solution fait intervenir le fait de parcourir le fichier à convertir différemment mais je n'ai pas de fichier ; ou bien d'utiliser UTF-16 mais je n'obtiens que des "???????" en résultat...

    Sur le lien partagé ci-dessus, tout est simple : avec l'encodage ASCII, on obtient directement le résultat.
    Est-ce également possible sur Python ?

    En attendant vos réponses, je vous souhaite une très bonne journée
    Bien cordialement, WD

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Un "caractère", c'est juste l'association entre un entier et le dessin qui permet de l'afficher.

    ASCII ne sait associer que les entiers compris entre 0 et 127.
    FF(=255) étant supérieur, il n'y a pas de caractère ASCII à mettre en face.

    latin-1 y associe le caractère 'ÿ'.

    Mais il est inutile de convertir une suite de bytes sous la forme de "caractères" si ce ne sont pas des caractères (çà vous apporte quoi comme information?) d'autant que Python le fait très bien (si vous utilisez une suite de bytes).

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

  3. #3
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2017
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2017
    Messages : 16
    Par défaut Merci beaucoup !!
    Bonjour Wiztricks et merci

    Je cherchais à comparer cette chaîne en hexa avec le contenue d'un fichier qui contenait les caractères suivant :
    K200599-12A ÿÿÿÿÿÿÿÿAAbA
    19990

    Il fallait que le décodage de l'hexa et le contenue du fichier soit les mêmes.
    Quand j'ai vu le résultat dans le fichier, je me suis dit que c'était de l'ASCII alors que c'était du Latin-1.

    En exécutant le code suivant, je n'ai plus d'erreur et la comparaison est ok :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    data_read = 4B 32 30 30 35 39 39 2D 31 32 41 20 FF FF FF FF FF FF FF FF 41 41 62 41 0A 31 39 39 39 30
    # we decode hexa to 'latin-1'
    data_in_ascii = bytes.fromhex(data_read).decode('latin-1')
    Tu as répondu sans le vouloir à ma question mal énoncée
    Passez une très bonne journée !

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Citation Envoyé par durand.william Voir le message
    Il fallait que le décodage de l'hexa et le contenue du fichier soit les mêmes.
    Quand j'ai vu le résultat dans le fichier, je me suis dit que c'était de l'ASCII alors que c'était du Latin-1.
    Quel que soit l'encodage utilisé, un fichier n'est qu'une suite d'octets (bytes). Ceci dit la plupart des utilitaires pensent qu'à partir du moment où vous voulez afficher le contenu d'un fichier, on peut supposer que c'est un fichier "texte" (opposé à binaire) et ils s'appliquent à remplacer bytes par caractères imprimables.

    Si votre fichier contient "K200599-12A.... ", lisez son contenu en "binaire":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> b = open('test.dat', 'rb').read()
    >>> b
    b'K200599-12A \xff\xff\xff\xff\xff\xff\xff\xffAAbA\n19990'
    >>>
    et pour les comparer à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> hex_string = "4B 32 30 30 35 39 39 2D 31 32 41 20 FF FF FF FF FF FF FF FF 41
     41 62 41 0A 31 39 39 39 30"
    >>> t = bytes.fromhex(hex_string)
    il suffit de faire:
    L'intérêt est que vous respectez le besoin de départ (est ce que mon fichier contient cette suite de bytes) sans avoir à vous prendre les pieds dans l'encoding (çà ne sert à rien ici).

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

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

Discussions similaires

  1. Convertir une string en tableau de caractères
    Par alainpeniche dans le forum C++
    Réponses: 4
    Dernier message: 06/01/2007, 20h00
  2. convertir une string en une fonction
    Par danny_67 dans le forum XML
    Réponses: 2
    Dernier message: 26/08/2005, 13h55
  3. Comment convertir une string en boolean ?
    Par olivier12345600 dans le forum Langage
    Réponses: 6
    Dernier message: 25/06/2005, 15h54
  4. Convertir une string en image
    Par worldchampion57 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 16/05/2005, 09h55
  5. [Firebird] Convertir une String en date
    Par laffreuxthomas dans le forum SQL
    Réponses: 1
    Dernier message: 04/05/2005, 19h42

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