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 :

QbyteArray et QDatastream


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 68
    Par défaut
    Bonjour,

    J'ai quelques soucis avec qdatastream, QBytearray et une classe que j'ai créée:

    Je vous montre le code de ma classe ".h"

    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
    21
    22
    23
    24
    25
    26
    27
    28
     
    class Ana: public QObject
    {
    Q_OBJECT
     
    public:
    ** *enum eAnaInput{ Wr=0, Vi=1 };
     
    ** *Ana(QObject *parent = 0);
    ** *Ana(const Ana& other);
    ** *void operator =(const Ana& other);
    ** *~Ana();
    ** *static void InitAnaSystem();
     
    ** *inline qint16 GetInput(const eAnaInput& input) *{ return _Ana[input];}
    ** *bool IsEmpty();
     
    protected:
    ** *QVector<qint16> _Ana;
     
    ** *friend QDataStream & operator << (QDataStream &, const Ana &);
    ** *friend QDataStream & operator >> (QDataStream &, Ana &);
    };
     
    Q_DECLARE_METATYPE(Ana)
    Q_ENUMS(Ana::eAnaInput)
    QDataStream & operator << (QDataStream & out, const Ana & Valeur);
    QDataStream & operator >> (QDataStream & in, Ana & Valeur);
    le ".cpp"

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #include "Ana.h"
     
    Ana::Ana(QObject *parent):
    ** * * *QObject(parent)
    {
     
    }
     
    Ana::Ana(const Ana &other)
    {
    ** * setParent(other.parent());
    ** *_Ana = other._Ana;
    }
     
    void Ana::operator=(const Ana &other)
    {
    ** *setParent(other.parent());
    ** *_Ana = other._Ana;
    }
     
    Ana::~Ana()
    {
     
    }
     
    void Ana::InitAnaSystem()
    {
    ** *qRegisterMetaTypeStreamOperators<Ana>("Ana");
    ** *qMetaTypeId<Ana>();****// Teste la validité de la classe Ana
    }
     
    bool Ana::IsEmpty()
    {
    ** *return *_Ana.isEmpty();
    }
     
    QDataStream & operator << (QDataStream & out, const Ana & Valeur)
    {
    ** *out << Valeur._Ana;
    ** *return out;
    }
     
    QDataStream & operator >> (QDataStream & in, Ana & Valeur)
    {
    ** *in >> Valeur._Ana;
    ** *return in;
    }
    et la façon dont je dé-sérialise l'objet que je reçois depuis le réseaux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     * *
    Ana test;
    QDataStream in(ByteArrayDepuisRéseau);
    in >> test;
    Mais mon probléme, c'est quand je fais ca cela ne fonctionne pas malgres que quand je fasse QByteArray.toHex() j'ai la bonne trame.

    02000000 correspondant a la taille de mon vecteur (qint32) soit deux éléments qint16 valant respectivement 2600 = 38 et 8b00 = 139.

    Je ne comprend pas moi quand je désérialise j'ai l'impression que mon QByteArray et vide mais ce n'est pas le cas.

    Quelqu'un pourrait il m'aider c'est super important, merci

    je précise quand je fais QByteArray::toHex j'ai plutot ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "0200000026008b00"
    qui s'affiche dans ma console de debug de qtcreator, merci

    Autre précision ce sont des données que je recois depuis un automate et elle sont a mons avis en binaire

    Quand je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    qint16 i = *(qint16*) response.mid(30,2).constData();
    la cela fonctionne????

  2. #2
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 243
    Par défaut
    Un const dans la déclaration de l'opérateur de lecture du flux ??

    Je vois pas trop sinon

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    J'ai pas tous compris.
    Mais qu'es ce que tu obtiens et qu'es ce que tu doit avoir?

    Comme cela, je dirais que tu as un problème d'endian.
    http://qt.developpez.com/doc/latest/...l#setbyteorder

  4. #4
    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
    Salut,

    Alors d'abord, comme Yan, j'ai un peu de mal à comprendre ce que tu veux faire, et ou tu en es. Ce que j'ai compris c'est que tu lis un QByteArray qui vient de quelque part, et tu veux mettre ce QByteArray dans ta classe Ana (qui est en gros un QVector<qint16>) en utilisant les QDataStream. Est ce correct ?

    Sinon, perso j'ai toujours eu du mal avec la surcharge d'opérateur, et je suis encore moins habile avec QVariant et les metatypes. Mais ce que je crois en comprendre, c'est que quand tu fais un Q_Declare_Metatype et Cie, Qt va créer un "modèle de données", composée uniquement de "types de base" qui représente ta classe. Du genre un Ana = int, int, int, char, char, char*, float, double.(c'est n'importe quoi, c'est pour illustrer).

    Ensuite, quand tu vas vouloir écrire ton Ana sur un stream, en fait ton programme va écrire la représentation de ton Ana sur le support (donc int, int, int, char, char, char*, float, double). Et je pense qu'il en est de même quand tu vas vouloir lire un Ana à partir d'un stream, ton programme va s'attendre à avoir un "int, int, int, char, char, char*, float, double" pour recréer ton Ana.

    Voilà grossièrement comment je comprends les Metatype de Qt, mais je me plante surement.

    En tout cas, quand tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    QDataStream & operator >> (QDataStream & in, Ana & Valeur)
    {
    ** *in >> Valeur._Ana;
    ** *return in;
    }
    Et que la chose en entrée ne correspond pas à ce qu' attend ton programme, il va créer n'importe quoi, ou rien. Et je pense que c'est le cas, dans ton QByteArray tu n'as pas un QVector<qint16> encodé, mais une suite de valeur, ce qui est très différent dans la représentation "machine". (Pour l'homme ca reste une suite de nombre).

    Donc c'est à toi de faire la correspondance entre une"suite de valeurs envoyées par l'automate" et un QVector<qint16>. En gros, un truc du genre aurait déjà plus de chances de fonctionner(selon moi toujours) :
    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
    QDataStream & operator >> (QDataStream & in, Ana & Valeur)
    {
    	while(!in.atEnd())
    	{
    	char* s = new char[100];
    	int length = in.readRawData(s,100);
    	qint16 data;
    	for(int i=0;i<length;)
    	{
    		data=s[i++];
    		data=((data<<8)+s[i++]);
    		Valeur._Ana.append(data);
    	}
     
    	delete[] s;
    	}
        return in;
    }
    Enfin, je jette ça sans aucune garantie, mais je pense qu'il faut s'attarder sur la représentation de tes données si tu veux résoudre ton problème.

    G.

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 68
    Par défaut
    Merci pour vos reponse a tous, j'ai fini par me rendre compte que l'automate m'envoyer la premier donnée en bigendian et les suivante en little endian,

    donc comme mon premier element etait la taille de mon vecteur ca faisais n'importe quoi. merci tout de meme de votre attention

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

Discussions similaires

  1. Problème de pointeur / QDataStream et/ou QByteArray
    Par gregoire.stein dans le forum Débuter
    Réponses: 2
    Dernier message: 01/02/2014, 16h16
  2. équivalent du couple QByteArray/QDataStream
    Par stardeath dans le forum C++
    Réponses: 7
    Dernier message: 27/07/2011, 13h53
  3. Convertir un QDataStream en QByteArray
    Par kek's dans le forum Qt
    Réponses: 2
    Dernier message: 04/02/2011, 11h20
  4. Réponses: 21
    Dernier message: 14/11/2008, 12h02
  5. Réponses: 6
    Dernier message: 07/03/2007, 14h59

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