C/C++ [Résolu] [C] Comment faire son reader/writer ?

Inscrit
21 Octobre 2012
Messages
21
Reactions
0
#21
Re: [C] Comment faire son reader/writer ?

Même quand je l’enlève j'obtiens les même valeurs, mais je vois sur ton screen que la taille de ton paquet 1 = 11, or moi elle est égale à 8, c'est donc sûrement ça mon problème ? En tout cas un grand merci à toi d'avoir trouvé que ça venait de là :)
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#22
Re: [C] Comment faire son reader/writer ?

Sa depend aussi comment ton reader calcul la taille de paquet. Vous ne le calculer peut etre pas pareil. Mais bon c'est bizard ton probleme
 
Inscrit
29 Septembre 2011
Messages
393
Reactions
3
#23
Re: [C] Comment faire son reader/writer ?

De rien, mais la taille de mon packet moi c'est tous simplement la taille des bytes reçus par D2.

Cordialement.
 
Inscrit
21 Octobre 2012
Messages
21
Reactions
0
#24
Re: [C] Comment faire son reader/writer ?

Je dois donc avoir un autre problème autre part.. J'avais déjà essayer en enlevant le
Code:
pos = 0;
et j'obtiens ceci :


Je vais continuer de chercher, merci pour ça déjà :)
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#25
Re: [C] Comment faire son reader/writer ?

Sorrow a dit:
J'ai des doute sur la portabilité de ta variable "pos", la position est bien la même entre toutes tes fonction read ?
moi aussi :mrgreen: , combien vaut pos avant le 1er readInt ? (ca doit etre 3 , ce qui explique la difference entre ta taille de message et celle de tifoux , lui il exclu le header de 3 octets , 3 octets de header + 4 octets par interger * 2 = 11 ou 8 si on compte que les integers)
 
Inscrit
21 Octobre 2012
Messages
21
Reactions
0
#26
Re: [C] Comment faire son reader/writer ?

Merci à vous tous et principalement à Tifoux qui m'a aidé via TeamViewer, le problème venait bien des variable Pos & Index.
J'obtiens les même valeurs que Sorrow :
Code:
[ID] : 1  [Taille] : 8
RequiredVersion : 1228
CurrentVersion : 1236
Mais quand je le fais en C# j'obtiens
Code:
Required = 1484 - Current = 1492
Problem ? :/
 
Inscrit
29 Septembre 2011
Messages
393
Reactions
3
#27
Re: [C] Comment faire son reader/writer ?

Salut, déjà de rien avec plaisir et puis franchement je ne vois pourquoi il te sort c'est valeur ma meilleur solution c'est que tu continue t'est function pour lire les UTF etc puis tu regarde avec le packet 3 si tu a un dépassement ou autre.

Cordialement
 
Inscrit
21 Octobre 2012
Messages
21
Reactions
0
#28
Re: [C] Comment faire son reader/writer ?

Oui merci du conseil c'est ce que je fais, je continu ma route, merci à vous, j'ai passé le sujet en résolu :)
 
Inscrit
3 Novembre 2011
Messages
51
Reactions
0
#29
Si ça t’intéresse j'ai 2 petites classes pour reader et writer que j'ai fait en C++/Qt5.2

https://github.com/nostrora/DataIO

Avec Qt, je pense que c'est difficile de faire plus simple que mes 2 classes. Le main.cpp est un exemple d'utilisation des classes.
Bonne chance
 
A

Anonymous

Invité
#30
Salut,
Elle marchent parfaitement tes deux classes ? Je code aussi en Qt, mais j'ai pas osé utiliser les QDataStream.
Du coup j'ai fait mes reader/writer en templates et ils ont l'air de marcher :

Code:
#ifndef BIGENDIANREADER_H
#define BIGENDIANREADER_H

#include <QByteArray>
#include <QString>

namespace Protocol
{
namespace IO
{

class BigEndianReader
{
public:
    BigEndianReader(const QByteArray &buffer);

    char readByte();
    unsigned char readUnsignedByte();
    bool readBoolean();
    short readShort();
    ushort readUnsignedShort();
    int readInt();
    uint readUnsignedInt();
    float readFloat();
    double readDouble();

    QByteArray readBytes(int size);
    QString readUTF();

    const QByteArray& data() const;

private:
    template <typename T>
    T read();

    QByteArray _buffer;
    int _position;
};

template <typename T>
T BigEndianReader::read()
{
    union {
        T v;
        char s8[sizeof(T)];
    } dest;

    for(int i = sizeof(T) - 1; i >= 0; i--)
        dest.s8[i] = readByte();

    return dest.v;
}

}
}

#endif // BIGENDIANREADER_H
Code:
#include "bigendianreader.h"
#include <QDebug>

using namespace Protocol::IO;

BigEndianReader::BigEndianReader(const QByteArray &buffer)
    : _buffer(buffer), _position(0)
{
}

char BigEndianReader::readByte()
{
    if(_position == _buffer.size()) {
        qWarning() << "BigEndianReader: read overflow." << _position;
        return 0;
    }
    return _buffer.at(_position++);
}

unsigned char BigEndianReader::readUnsignedByte()
{
    union {
       char c;
       unsigned char uc;
    } u;

    u.c = readByte();

    return u.uc;
}

bool BigEndianReader::readBoolean()
{
    return (readByte() != 0);
}

short BigEndianReader::readShort()
{
    return read<qint16>();
}

ushort BigEndianReader::readUnsignedShort()
{
    return read<quint16>();
}

int BigEndianReader::readInt()
{
    return read<qint32>();
}

uint BigEndianReader::readUnsignedInt()
{
    return read<quint32>();
}

float BigEndianReader::readFloat()
{
    return read<float>();
}

double BigEndianReader::readDouble()
{
    return read<double>();
}

QByteArray BigEndianReader::readBytes(int size)
{
    QByteArray bytes;
    for(int i = 0; i < size; i++) {
        bytes.append( readByte() );
    }
    return bytes;
}

QString BigEndianReader::readUTF()
{
    unsigned short size = readUnsignedShort();
    return QString::fromUtf8( readBytes(size) );
}

const QByteArray &BigEndianReader::data() const
{
    return _buffer;
}
 
Inscrit
3 Novembre 2011
Messages
51
Reactions
0
#31
Oui elle fonctionne parfaitement. Je lis pas mal de messages et je n'ai eu aucun problème de lecture.
 
Haut Bas