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 :

[Problème ASCII] Hexadecimal to ASCII


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Stagiaire
    Inscrit en
    Avril 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Stagiaire

    Informations forums :
    Inscription : Avril 2016
    Messages : 9
    Par défaut [Problème ASCII] Hexadecimal to ASCII
    Bonjour à tous,

    J'essaye en ce moment de développer un programme Python 2.7 dans le but de faire communiquer un raspberry PI et une voiture via le port OBD-II. Pour ce faire j'utiliser l'ELM 327 qui me permet de communiquer avec la voiture. Mon raspberry est connecté à l'ELM 327 en bluetooth, et peut envoyer des requêtes et reçois des informations de la voiture.

    Mon problème est le suivant : Les messages renvoyées par la voiture sont d'un certains format, et lorsque je veux connaître le VIN (Vehicle Identification Number) de la voiture, le message renvoyées est de la forme suivante :
    "014
    0: 49 02 01 xx xx xx xx
    1: xx xx xx xx xx xx xx
    2: xx xx xx xx xx xx xx"

    Dans le message suivant, le 014 indique le nombre de message qui nous intéresse en hexadécimal, ici 17 (nombre de caractères du VIN).
    Ensuite les 0: , 1: et 2: indique l'ordre dans lequel les informations sont envoyées et enfin, le 49 02 01 indique que le message qui suit est la réponse au message 09 02, celui qui donne le VIN.
    L'information à décoder sont donc les xx. Ces derniers sont en hexadécimal et il me faut donc les traiter afin de décoder le message en ASCII.
    Pour ce faire, la méthode que j'ai utiliser à été de traiter toutes les informations qui ne m’intéresse pas en utilisant la fonction .replace(). En enfin, ma variable code contient le message ci-dessus. J'effectue donc par exemple "code = code.replace("49 02 01", "")" pour supprimer de ma variable code le 49 02 01. J'effectue également pour le 014 ainsi que les "0:", "1:" et "2:". J'obtient donc une variable code de la forme suivante :
    "526621
    143DE4A263A31
    1343525255834"
    (j'ai volontairement changé les caractères pour ne pas mettre le VIN ne mon véhicule sur internet). Pour décoder ce message en ASCII, j'utilise la fonction :
    "vin = bytearray.fromhex(code).decode()".
    Le problème est que lorsque j'utilise cette fonction, j'obtient une erreur au changement de ligne (au 6 ème caractère de la première ligne). J'imagine que j'en obtiendrai une également au second changement de ligne mais le traitement du code ne va pas jusque là. L'erreur exacte est la suivante :
    "ValueError : non-hexadecimal number found in fromhex() arg at position 6".

    Je n'ai aucune idée de comment transformer ces valeurs hexadécimale en ASCII.
    Toute aide ou indication serait fortement appréciée. Merci d'avance à tous.
    Khoneb

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

    Citation Envoyé par khoneb Voir le message
    Le problème est que lorsque j'utilise cette fonction, j'obtient une erreur au changement de ligne (au 6 ème caractère de la première ligne). J'imagine que j'en obtiendrai une également au second changement de ligne mais le traitement du code ne va pas jusque là. L'erreur exacte est la suivante : "ValueError : non-hexadecimal number found in fromhex() arg at position 6".
    Le changement de ligne ('\n') n'est pas un digit hexadecimal.
    Vous pourriez "supprimer" ces changements de lignes mais les 17 octets d'un "vehicle identifiation number" doivent être interprétés de façon segmentée (voir leur format dans l'article wikipedia).
    Inutile d'essayer de faire marcher un "bytearray.fromhex(code).decode()": il n'y a aucune raison pour que çà fonctionne.

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

  3. #3
    Membre régulier
    Homme Profil pro
    Stagiaire
    Inscrit en
    Avril 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Stagiaire

    Informations forums :
    Inscription : Avril 2016
    Messages : 9
    Par défaut
    Donc il me faut soit supprimer le changement de ligne '\n', soit utiliser une autre fonction pour décoder de l'hexadécimal en ASCII ?
    Je me suis renseigné un peu sur binascii, est-ce que cette bibliothèque à plus de change de fonctionner ?

    Merci d'avance.

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

    Citation Envoyé par khoneb Voir le message
    Donc il me faut soit supprimer le changement de ligne '\n', soit utiliser une autre fonction pour décoder de l'hexadécimal en ASCII ?
    Je me suis renseigné un peu sur binascii, est-ce que cette bibliothèque à plus de change de fonctionner ?
    non: il faut découper vos 17 octets en tranches/champs et les interpréter comme indiqué dans l'article.
    Comme il n'y a aucune raison pour que ces entiers soit dans 0..127, impossible d'en faire des caractères ASCII et çà vous servirait à quoi?

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

  5. #5
    Membre régulier
    Homme Profil pro
    Stagiaire
    Inscrit en
    Avril 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Stagiaire

    Informations forums :
    Inscription : Avril 2016
    Messages : 9
    Par défaut
    Tout d'abord merci pour les réponses !

    Malheureusement je ne vois pas comment découper les octets comme l'article le montre. Je ne veux pas pouvoir en déduire les informations tels que marque du véhicule que contient le VIN mais juste obtenir le VIN exacte dans une chaîne de caractère. L'utilisation serait juste de rentrer les informations du véhicule dans une base de données.

    "Comme il n'y a aucune raison pour que ces entiers soit dans 0..127", que voulez vous dire par là ? Je suis désolé mais je suis débutant en Python et en décodage d'informations.

    Merci d'avance

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

    Citation Envoyé par khoneb Voir le message
    Malheureusement je ne vois pas comment découper les octets comme l'article le montre. Je ne veux pas pouvoir en déduire les informations tels que marque du véhicule que contient le VIN mais juste obtenir le VIN exacte dans une chaîne de caractère. L'utilisation serait juste de rentrer les informations du véhicule dans une base de données.
    Le contenu de la variable "code" que vous avez est déjà le VIN sous la forme d'une chaîne de caractère ASCII.

    Citation Envoyé par khoneb Voir le message
    "Comme il n'y a aucune raison pour que ces entiers soit dans 0..127", que voulez vous dire par là ? Je suis désolé mais je suis débutant en Python et en décodage d'informations.
    Je comprends que vous ne compreniez pas mais vous avez plein de tutos, cours, bouquins, ... avec lesquels vous pouvez apprendre les bases. Tapez ASCII sur Google, vous allez avoir un article Wikipedia qui va vous expliquer ce que c'est. Cà date des années 60 depuis nous avons inventé des tas d'autres notions/concepts qu'il faut connaître pour programmer en comprenant un peu ce qu'on fait.

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

Discussions similaires

  1. Petit problème pour écrire en ASCII sur spritebatch
    Par skuller42 dans le forum XNA/Monogame
    Réponses: 1
    Dernier message: 24/02/2015, 13h50
  2. [Python 2.X] Problème affichage caractères non ASCII
    Par nekcorp dans le forum Général Python
    Réponses: 10
    Dernier message: 26/01/2015, 10h49
  3. Problème avec un tableau ascii
    Par Stephane_br dans le forum VB.NET
    Réponses: 0
    Dernier message: 11/02/2014, 12h45
  4. Petit problème de conversion EBCDIC -> ASCII
    Par alex140025 dans le forum Langage
    Réponses: 4
    Dernier message: 29/07/2011, 10h08
  5. texte --> ascii hexadecimal
    Par oeil de lynx dans le forum Débuter
    Réponses: 8
    Dernier message: 02/04/2008, 22h42

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