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

C++ Discussion :

Raw stream / Raw buffer


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 43
    Par défaut Raw stream / Raw buffer
    Bonjour,

    Je suis à la recherche d'une classe me permettant de gérer un buffer de bytes. En fait je souhaiterais avoir quelque chose comme QDataStream de la librairie Qt.

    J'ai regardé du coté de la STL mais j'ai rien trouvé de terrible. La seule solution qui me vient est de dériver de streambuf et d'implémenter pas mal de truc.

    En fait, j'aimerais juste avoir une classe comme ostringstream, mais dans lequel les types primaires sont écrits en binaire et non pas transformés en caractères.

    Merci pour aide.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    ostringstream ouvert en binary avec read() et write(), c'est très bien.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 43
    Par défaut
    Ok merci, j'avais pas pensé à ouvrir ostringstream en binary. Bêtement je pensais que ça marchait que pour les fichiers. Je vais tester çà.

    Merci.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 43
    Par défaut
    J'arrive à écrire dans un stringstream en binaire sans problème.
    Par contre j'ai quelques soucis pour lire. En fait j'utilise dans une communication réseau.
    D'un côté, j'écris dans un stringstream, passe le buffer par un socket, et de l'autre côté, je dépile les infos.
    J'aimerais donc créer un stringstream initialisant au contenu d'un buffer (char*), puis effectuer des opérations dessus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char* buffer;
    //reception
    std::stringstream stream(buffer, std::ios:binary | std::ios:input)
    int entier;
    stream.read(reinterpret_cast<char*>(&entier), sizeof(int));
    Cele na marche pas, après l'appel à read, la fonction tellg me renvoie -1, signe d'un soucis.

    Pour l'instant je m'en sors avec des memcpy.

    Merci.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 90
    Par défaut
    Le paramètre buffer que tu passes à stringstream doit être une string (ou un char[] qui se termine par '\0'). Si ce n'est pas le cas, ça risque de ne pas marcher comme prévu.

    Vu que tu connais l'adresse, le type et la taille des données que tu manipules, ta solution avec memcpy me paraît acceptable (une fonction template pourrait faire le travail). Tu pourrais même faire un reinterpret_cast directement sur buffer.

    Si tu tiens absolument à utiliser un stream, il te faut pouvoir initialiser à buffer le streambuf sous-jacent. Malheureusement, la fonction setbuf est protégée, ce qui signifie que tu dois dériver :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class Stringbuf: public stringbuf {
    public:
     Stringbuf(char *buff, streamsize n): stringbuf(ios_base::in|ios_base::binary) {
      if (setbuf(buff,n)==NULL) {
       // Erreur à gérer
      }
    }
    };
    A l'utilisation ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     char *buffer;
     // reception
     Stringbuf sb(buffer,bufferSize);
     istream stream(&sb);
     int entier;
     stream.read(reinterpret_cast<char*>(&entier), sizeof(int));
    Attention : buffer doit être créé avec new et ne doit pas être effacé avec delete (le stringbuf s'en charge) sauf si l'appel à la fonction setbuf échoue dans le constructeur de Stringbuf ci-dessus.

Discussions similaires

  1. Réponses: 15
    Dernier message: 04/01/2007, 11h15
  2. DATABASE LINK + type Long et long raw ...
    Par bchristo dans le forum Administration
    Réponses: 21
    Dernier message: 26/04/2004, 15h27
  3. App Socket Raw avec VC++6
    Par Martin Soucy dans le forum Développement
    Réponses: 3
    Dernier message: 04/12/2002, 05h07
  4. raw socket et langage c
    Par SlayDave dans le forum Développement
    Réponses: 2
    Dernier message: 29/08/2002, 19h09
  5. lire une image au format RAW
    Par Anonymous dans le forum OpenGL
    Réponses: 5
    Dernier message: 20/05/2002, 00h11

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