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 de QString en INT, UINT, etc.


Sujet :

Qt

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 32
    Points : 27
    Points
    27
    Par défaut Conversion de QString en INT, UINT, etc.
    Bonjour,

    voilà mon petit problème, lors que j'utilise la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          int val = item->text().toInt(&ok, 10);
          str.sprintf("%X", val);
    J'obtient 0xFFFFVVVV (VVVV étant ma valeur sur 16bit).

    Comment pourrais je supprimer les F de complétion? J'avoue que j'ai beau tout testé rien n'y fiat :@.
    Sachant que mon code doit tourner pour des valeurs 32bits et 64 bits.
    J'ai un switch qui fait le taf, sur du 32 bits j'ai pas de soucis.

    Merci pour le coup de patte si possible
    Sangfeust

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Je pense qu'il faut utiliser le format "%hX" pour indiquer que c'est un short (soit un truc sur 16 bits généralement). (Voir man du printf)
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Bonjour,

    Hélas cela ne fonctionne toujours pas j'ai testé : %hX et %hhX et cela reste identique.

    J'ai un début de solution mais c'est un peu l'artillerie lourde !!

    Voilà ce que j'ai testé et qui semble fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
          QString val;
          QTextStream *stream = new QTextStream(&val);
          stream->setIntegerBase(16);
     
          val = item->text().toInt(&ok, 10);
          *stream << quint16(val);
    Cela me semble carrément lourd pour pas grand chose mais je n'ai pas mieux sous la main...

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Peut être : %4X, alors ?
    ou en C++ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::cout.width(10);
    std::cout << std::hex << variable << std::endl;
    Mais je ne suis plus très sur.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    J'ai déjà testé le %4X mais cela ne fonctionne pas...

    Je n'utilise pas la sortie standard car j'affiche les valeurs dans un QTableWidget.

    En gros je tente de faire une fonction qui me permet de passer d'un affichage décimal à un affichage hexadecimal ou binaire et inversement. Le tout pour des valeurs de type INT/UINT/DINT/UDINT/FLOAT/DOUBLE/BOOL .....

    Bref j'ai encore du taf.
    Surtout que ma méthode fonctionne pour transformer -16216 en C0A8 mais étonnamment cela ne marche pas en sens inverse de C0A8 je retrouve 49320 :@ !!!
    Et je n'ai toujours pas la solution!

    EDIT:
    C'est tout bon enfin pour la conversion HEX->DEC et DEC->HEX en 16 bits.
    Pour DEC->HEX
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      QString str;
      QTextStream *stream = new QTextStream(&str);
      stream->setIntegerBase(10);
      val = item->text().toInt(&ok, 16);
      *stream << qint16(val);
    Pour DEC->HEX
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      QString str;
      QTextStream *stream = new QTextStream(&str);
      stream->setIntegerBase(16);
      val = item->text().toInt(&ok, 10);
      *stream << qint16(val);

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par Sangfeust Voir le message
    J'obtient 0xFFFFVVVV (VVVV étant ma valeur sur 16bit).

    Comment pourrais je supprimer les F de complétion? J'avoue que j'ai beau tout testé rien n'y fiat :@.
    Travaillant avec des nombres négatifs, il est tout à fait normal d'avoir ces F devant, et vouloir les supprimer est faux.
    Je te conseille de te renseigner sur le complément à deux.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Arf tout s'écroule !!!

    OK j'ai vu l'histoire du complément à 2!!

    Mais alors comment je fais pour détecter une telle chose!!
    Le problème c'est que dans mon affichage je n'ai pas besoins du complément à 2! J'ai vu que cela n'est utile que lors d'addition soustraction.

    Moi ce que je veux c'est par exemple que -16216 soit vu en C0A8, puis qu'on puisse revenir à C0A8...
    Hors avec le complément à 2 je me retrouve dans une vilaine situation qui fait que j'obtiens FFFFC0A8, donc forcément ma conversion en DEC devient fausse.

    En plus un effet de bord non prévu c'est le changement de type (genre un INT qui devient un DINT me fausse mes résultats pour la conversion HEX->DEC)
    Exemple: C018 devient 49320 au lieu de -16216.

    Et en DINT -16216 converti en HEX devient FFFFC0A8 :s

    Arf des idées?

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Sangfeust Voir le message
    Moi ce que je veux c'est par exemple que -16216 soit vu en C0A8, puis qu'on puisse revenir à C0A8...
    Et comment tu différencies alors que tu as +16216 ou -16216 ?

    À noter que C0A816 vaut bien 4932010 d'où l'importance des F devant, et le fait que tu considères des nombre signés, et donc le premier bit représentant le signe.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Et comment tu différencies alors que tu as +16216 ou -16216 ?

    À noter que C0A816 vaut bien 4932010 d'où l'importance des F devant, et le fait que tu considères des nombre signés, et donc le premier bit représentant le signe.
    Mouarf killé !!

    Je suis bien d'accord que 49320 vaut C0A8 mais en soit cela ne me pose pas de problème car avec le passage de DINT en INT je retrouve la bonne valeur je pense donc verrouiller les changement de type pour éviter ce genre de problème.

    Mais comment je fais pour gérer la conversion FFFFC0A8 en -16216 ....

    Car je n'y arrive pas pour le coup !

  10. #10
    Invité
    Invité(e)
    Par défaut
    En convertissant ton QString en entier non signé évitant ainsi un overflow non géré par la méthode toInt(), puis castant la retour en entier signé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    qint32 val = static_cast<qint32>( QString("FFFFC0A8").toUInt(&ok, 16) );

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    En convertissant ton QString en entier non signé évitant ainsi un overflow non géré par la méthode toInt(), puis castant la retour en entier signé
    EVIDEMMENT !!

    Trop fort!

    J'ai passé trop de temps sur ce truc ça m'a pris la tête alors que c'était trop simple. Pas pensé à passer d'abord par le UINT puis casté ensuite!

    MERCI beaucoup !!!
    Ouf sauvé.

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

Discussions similaires

  1. [Debutant] conversion de char en int
    Par Marc_3 dans le forum Langage
    Réponses: 9
    Dernier message: 31/08/2011, 12h02
  2. conversion de bit en int, float, char, etc.
    Par ncheboi dans le forum Débuter
    Réponses: 12
    Dernier message: 25/09/2010, 17h30
  3. [XSLT] Conversion xml vers txt ou mdb etc
    Par narodar dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 23/06/2006, 14h31
  4. [C++] Conversion de String en int
    Par poporiding dans le forum Framework .NET
    Réponses: 2
    Dernier message: 02/01/2006, 16h43
  5. conversion en QString
    Par transistor49 dans le forum C++
    Réponses: 5
    Dernier message: 08/03/2005, 13h52

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