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 :

Compresser et decompresser des structures


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Compresser et decompresser des structures
    Bonjour,

    J'ai besoin de passer d'une structure a un std::vector<char> et inversement.
    J'aimerais savoir si vous avez un moyen plus efficasse que le mien.

    struct -> vector
    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
    std::vector<char> &             MaClass::pack(maStruct * packet)
    {
      std::string                   myString;
      std::stringstream         myStream;
      std::vector<char>        *to_ret = new std::vector<char>;
     
      if (packet)
        {
          myStream << packet->infoA;
          myStream << packet->infoB;
     
          myString = myStream.str();
          for (unsigned int i = 0 ; i < myString.size() ; ++i)
            (*to_ret)[i] = myString[i];
        }
     
      return *to_ret;
    }
    vector -> struct
    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
    maStruct *                      MaClass::unpack(std::vector<char> & buffer)
    {
      std::string                    myString;
      std::stringstream          myStream;
      t_packet                      *to_ret = new t_packet;
     
     
      if (!buffer.empty())
        {
          myString.resize(buffer.size());
          for (unsigned int i = 0 ; i < buffer.size() ; ++i)
            myString[i] = buffer[i];
     
          myStream << myString.erase(0 , sizeof(to_ret->infoA));
          myStream >> to_ret->infoA;
          myStream.clear();
          myStream << myString.erase(0 , sizeof(to_ret->infoB));
          myStream >> to_ret->infoB;
          myStream.clear();
          return to_ret;
        }
      else
        delete to_ret;
      return NULL;
    }
    Dernière modification par Invité ; 07/12/2012 à 12h08.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Pourrais-tu nous montrer la déclaration de ta structure pour voir exactement ce qu'elle contient ?

    Sinon quel est le but de ton std::vector<char>, que vas-tu faire avec par la suite ?

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    dans l'ordre qui me vient à l'esprit
    - quelle idée saugrenue
    - d'où te vient ce "besoin" ?
    - quelle différence entre une std::string et un vector<char> ?
    - allocation dynamique d'un vector ?
    - fuite mémoire sûrement
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Je fait cela pour echanger des donnees avec un serveur via un protocol TCP.

    voici la structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    struct                          t_header
    {
            unsigned char   type;
            unsigned int    sender_id;
            unsigned int    receiver_id;
            unsigned int    info_length;
    };
     
    struct                          t_packet
    {
            t_header        header;
            char            data*;
    };
    Le fait de convertir la structure en vector<char> me permet d'avoir un typage lourd et (je n'en suis pas certin) d'eviter les problemes de big et little endian.
    Dernière modification par Invité ; 07/12/2012 à 14h33.

  5. #5
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Il y a des fonctions pour ne pas se soucier de cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    htons()
        Reorder the bytes of a 16-bit unsigned value from processor order to network order. The macro name can be read as "host to network short." 
    htonl()
        Reorder the bytes of a 32-bit unsigned value from processor order to network order. The macro name can be read as "host to network long."
    ntohs()
        Reorder the bytes of a 16-bit unsigned value from network order to processor order. The macro name can be read as "network to host short." 
    ntohl()
        Reorder the bytes of a 32-bit unsigned value from network order to processor order. The macro name can be read as "network to host long."

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Sinon, la seule chose qui l'assure c'est des spec à jour qui détaillent comment sont encodées les données.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. compression et decompression des fichiers
    Par ron lavezi dans le forum Visual C++
    Réponses: 2
    Dernier message: 05/03/2015, 10h05
  2. [Lex/Yacc] Aide traduction des structures de contrôle
    Par pelo68 dans le forum Générateurs de compilateur
    Réponses: 2
    Dernier message: 07/12/2010, 10h26
  3. [Stratégie] Type des structure de persistance
    Par calogerogigante dans le forum Général Java
    Réponses: 10
    Dernier message: 09/02/2006, 08h06
  4. Probleme avec des structures
    Par lenectar dans le forum C
    Réponses: 17
    Dernier message: 30/12/2005, 09h53
  5. Compresser et decompresser un ensemble de fichier
    Par Walm dans le forum C++Builder
    Réponses: 2
    Dernier message: 12/01/2004, 16h23

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