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

Qt Discussion :

Conversion caractère spécial en ascii


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 63
    Par défaut Conversion caractère spécial en ascii
    Bonjour à tous!

    J'ai un soucis de dernière minute lors du test de mon appli.
    Je dois comparer une chaine de caractère avec un code ascii saisi en décimal.
    Exemple: 05 qui correspond à ENQ.
    Je voudrais comparer ceci avec une lettre QString par exemple mais je m'en sors pas avec les conversions.
    (entre QbyteArray, toAscii...)
    J'avoue que je suis perdu ...
    Quelqu'un a une idée?

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Désolé, je comprends pas ta question.

    Essaie de nous donner un bout de code et de détailler un peu plus.

    G.

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 63
    Par défaut
    Salut,

    Effectivement c'est pas très compréhensible!
    En fait, je bufferise des trames arrivées sur un port série jusqu'à l'arrivée d'un certain caractère qui désigne la fin de trame.

    Ce caractère est configuré d'avance car il est récupéré depuis un fichier en valeur décimale du code ascii.

    Donc par exemple si j'ai "10", il s'agit du retour chariot, si j'ai "66", il s'agit de la lettre "B"...

    Mon problème: (Que je n'ai toujours pas réussi à résoudre malgré toutes mes recherches)

    Vu que les émissions séries sont un peu instables,je récupère chaque caractère de ma trame un à un et le compare avec ce caractère de fin (pour savoir quand je sors de ma boucle)
    Le caractère que je récupère est un QString.
    Je peux facilement le convertir grâce à la méthode toAscii() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    QString carRecup;
    carRecup.toAscii(); // Logiquement le caractère est en Ascii
    J'ai donc la boucle suivante sur la variable TrameRecue (de tête à peu près):
    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
    16
    17
    18
    19
    20
     
    int cptCar; //Compteur de la boucle de comparaison
    QString TrameRecue; //Trame en entrée du port série
    Qstring TrameRecomp; //Trame recomposée des caractères reçus
    Qstring CarBoucle; // Caractère de chaque itération
    QString CarFin; //Caractère qui désigne la fin de la trame récupéré d'un fichier texte
     
     
    //Boucle de comparaison
     
    for (cptCar=0; cptCar<TrameRecue.length();cptCar++){
     
    CarBoucle = TrameRecue.mid(cptCar,1); //Récupération du caractère
    TrameRecomp = TrameRecomp.append(CarBoucle); // Ajout du dernier caractère reçu à la trame
     
    if (CarBoucle == CarFin){ //Ici est tout mon problème :(
    //Traitement de fin de trame
    }
     
    }
    J'aurais voulu faire un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if (CarBoucle.toAscii() == CarFin.toAscii()){
    //Traitement...
    }
    Mais je n'arrive jamais à mon traitement puisque en mode pas à pas un CarFin.toAscii() me donne tout simplement la même chose. Si c'était la valeur "10", je retrouve la valeur "10"...

    Voilà, et vu que j'ai un peu tout essayé je bloque...

    En espérant être un peu plus clair que sur mon premier post.
    Toute aide est la bienvenue

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 63
    Par défaut
    Bonjour,

    Hier j'ai encore cherché un moyen d'effectuer ma comparaison.
    Je me suis dit que j'allais un peu oublier le code ASCII et comparer en hexa.
    Cependant j'ai quelques incompréhensions...

    Tout d'abord, je stocke la valeur décimale du caractère de fin de trame dans un long.
    Ensuite, grâce à la méthode QString::number(CarFin,16) je récupère la valeur hexa de cette valeur décimale (d'après ce que j'ai compris)
    Elle est stockée dans une chaine QString :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QString StrCarFin = QString::number(CarFin,16);
    Et lorsque j'arrive à ma comparaison, je fais une conversion de ma chaine en cours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     if (CarBoucle.toAscii().toHex() == StrCarFin) {
    }
    Pour moi il s'agit d'une comparaison de deux chaines de caractères qui contiennent un code hexa.
    C'est un petit peu tordu, mais cette comparaison marche... Pour des valeurs décimales > 15 !!

    En effet, pour les valeurs <15, le code héxa renvoyé dans la chaine StrCarFin supprime le "0" devant!
    Par exemple, la valeur 13 qui est le retour chariot devrait renvoyer "0d" mais il renvoie seulement "d".
    Par contre, CarBoucle.toAscii().toHex() renverra bien "0d" si il tombe sur un retour chariot.

    On arrive donc à une comparaison if ("0d" == "d") ce qui ne marche évidement pas.
    Déjà est-ce que quelqu'un sait pourquoi?

    Donc ayant identifié ce problème j'ai fait une fonction qui rajoute le "0" devant les correspondances Hexa des valeurs décimales inférieures ou égales à 15.

    Ca marche pour les différents tests que j'ai fait mais je trouve ça super moche!
    Personne n'a déjà été confronté à ce problème de conversion?
    J'avoue que deux trois conseils me seraient utiles...

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

Discussions similaires

  1. Conversion caractère spécial
    Par nsqualli dans le forum Cobol
    Réponses: 4
    Dernier message: 23/05/2012, 16h10
  2. conversion Caractère vers ASCII
    Par tobba dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 09/11/2010, 18h44
  3. caractère spécial (ASCII étendu)
    Par Peanut dans le forum C#
    Réponses: 12
    Dernier message: 23/04/2008, 16h34
  4. Conversion caractère ascii
    Par Bass_Room dans le forum C
    Réponses: 9
    Dernier message: 25/04/2007, 17h30
  5. Réponses: 2
    Dernier message: 30/05/2006, 08h04

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