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 :

sauvegarde sérialisée manuel de champs de bitfields


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 127
    Par défaut sauvegarde sérialisée manuel de champs de bitfields
    Bonjour, j'ai par exemple le champ de bits suivant:

    unsigned int relativeDensity : 6;
    unsigned int antiCubicDensity : 6;
    int magnetActrprr : 20;

    Je souhaite faire une sauvegarde sérialisé des deux derniers paramètres au bit près (je ne souhaite pas que antiCubicDensity prenne 32 bits dans la sauvegarde comme actuellement alors que 6 suffisent).

    Mon code actuel pour sérialiser des primitives est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template < typename value_type >
    inline void ecrireBinaire(ostream& out, const value_type& v) {
        out.write((char*)&v, sizeof(v));
    }
    si je fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template < typename value_type, int size >
    inline void ecrireBinaire(ostream& out, const value_type& v) {
        out.write((char*)&v, size);
    }
    est-ce logique ? Je n'ai pas essayé ...

    Et pour la lecture, actuellement j'utilise

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            template < typename type_val >
            inline void lireBinaire(ifstream& in, type_val& v)
            {
                in.read((char*)&v, sizeof(v));
            }
    puis-je faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            template < typename type_val, int size >
            inline void lireBinaire(ifstream& in, type_val& v)
            {
                in.read((char*)&v, size);
            }
    Je doute de la pertinence de mes suggessions.

    Cordialement,

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Rajouter un paramètre size ne servira pas à grand chose vu qu'il s'agit de la taille en octets (enfin en nombre de char plus précisément), pas du nombre de bits.

    De toute façons, la sérialisation brute binaire n'est pas portable. Tu change de machine ou de compilateur ou même d'option de compilation et ça ne fonctionne plus, car la représentation binaire des types peut changer.

    Une façon propre de procéder est d'écrire les données octets par octets par des manipulation de bits :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    out.put(relativeDensity | ((antiCubicDensity & 3) << 6)); // 6 + 2
    out.put((antiCubicDensity >> 2) | (magnetActrprr & 15) << 4); // 4 + 4
    out.put((magnetActrprr >> 4) & 255); // 8
    out.put((magnetActrprr >> 12) & 255); // 8

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 127
    Par défaut
    Merci,

    J'avais pensé faire ce genre de choses mais j'aurais aimé éviter. En effet, si je modifie la taille en bits des champs, ça me force à changer les valeurs dans les méthodes (à moins que je code les tailles en bits sous forme de constantes (ou en paramètre de template).

    Je vais donc partir là dessus.

    Cordialement,

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

Discussions similaires

  1. champ manuel et champ calculé
    Par Helobio dans le forum Access
    Réponses: 1
    Dernier message: 10/04/2014, 15h39
  2. remplacement manuel des champs de fusions
    Par Invité dans le forum Word
    Réponses: 1
    Dernier message: 08/08/2012, 14h47
  3. Réponses: 1
    Dernier message: 26/07/2010, 08h45
  4. [MySQL] sauvegarder valeur d'un champ d'un formulaire au refresh de la page
    Par tomguiss dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 02/06/2010, 20h56
  5. [AJAX] sauvegarde automatique d'un champ d'un formulaire
    Par LuneArgentee dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 22/04/2008, 13h41

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