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 :

Ecrire une valeur entière sur un nombre de bits spécifique


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 50
    Par défaut Ecrire une valeur entière sur un nombre de bits spécifique
    Bonjour à tous,
    Voici mon problème : je dois écrire dans un buffer (d'unsigned chars par exemple) des valeurs entières sur un nombre de bits spécifique afin de respecter une norme d'interface bien précise.
    Ex :
    - écrire 2 sur 2 bits
    - écrire 344 sur 16 bits
    - écrire 15 sur 4 bits
    - ...
    Il me faudrait une fonction qui prenne en paramètre le buffer, le nombre de bits et la valeur à écrire.
    Or mes cours d'architecture des ordinateurs sont bien loin et je ne suis pas très familier avec la manipulation de bits bas niveau ...

    EDIT : J'ai entendu parler du bitset, est-ce que ça pourrait m'aider ?

    Pourriez-vous m'éclairer ?

    Merci !

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour,
    Boost.Dynamic Bitset (en utilisant un bloc de type unsigned char pour éviter les problèmes d'endianess) te proposera ce qu'il te faut sans avoir à te soucier de la cuisine interne de manipulation de bit.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 50
    Par défaut
    Effectivement, ça a l'air sympa, mais malheureusement je ne peux pas utiliser externes autres que celles standard ...
    Tu n'aurais pas une autre solution classique même si elle est plus compliquée ?

    Merci

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 474
    Par défaut
    Bonjour,

    Ce n'est pas très difficile mais il y a une chose que je ne saisis pas : est-ce que tu dois faire tenir plusieurs valeurs différentes simultanément et dans le même buffer ? Parce que sinon, si ton buffer a une taille fixe, tu n'as pas vraiment besoin de te soucier de la place en bits qu'occupe le nombre que tu veux y stocker (sauf débordement, bien sûr).

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 50
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Bonjour,

    Ce n'est pas très difficile mais il y a une chose que je ne saisis pas : est-ce que tu dois faire tenir plusieurs valeurs différentes simultanément et dans le même buffer ? Parce que sinon, si ton buffer a une taille fixe, tu n'as pas vraiment besoin de te soucier de la place en bits qu'occupe le nombre que tu veux y stocker (sauf débordement, bien sûr).
    Oui, en gros j'ai besoin de stocker dans mon buffer : [0, 4, 67, 12, 354, 0, ...]. Et 0, 4, 67, 12, 354, 0 sont sur un nombre de bits spécifiques.
    Je passe en binaire pour le transformer en hexa par la suite.

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 474
    Par défaut
    Citation Envoyé par bobobobo01 Voir le message
    Je passe en binaire pour le transformer en hexa par la suite.
    Oui, enfin, en mémoire, tes informations seront toujours stockées en binaire. Si la place importe, c'est bien le nombre de chiffres binaires (bits) qui importe et pas le nombre de chiffres hexadécimaux ou autres…

    Encore une question : comment comptes-tu passer la suite de nombres successifs à stocker ? Si c'est un couple nombre+taille à chaque appel à ta fonction, il faudra prévoir une façon de garder la trace du remplissage entre deux appels et prévoir une possibilité d'initialiser le tableau.

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par bobobobo01 Voir le message
    Effectivement, ça a l'air sympa, mais malheureusement je ne peux pas utiliser externes autres que celles standard ...
    J'en déduis que c'est pas un besoin pro mais la correction à l'arrache d'une exercice que tu cherches ?

    Tu peux te baser sur std::bitset si le nombre de bit est fixe (par exemple car lié à un en-tête fixe de protocole) ou std::vector<bool> (mais à manier avec précaution car différent d'un std::vector dans la continuité du buffer) pour la construction d'un 'pack' de bits. Te reste à écrire une fonction de sérialisation depuis le conteneur vers un buffer de byte (std::vector<unsigned char>), sérialisation assez triviale, à coup de décalage de bits (y'a pas de contrepèterie) et de masques.

    Ou sinon, c'est tout à la main : un std::vector<unsigned char> pour le buffer, une/des fonctions pour convertir un entier vers des bits (toujours masque + décalage et toujours pas de contrepèterie), un état courant sur le nombre de bits de l'octet en cours de construction, une politique de padding si au final c'est pas un multiple de huit, et roule ma poule

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 50
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    J'en déduis que c'est pas un besoin pro mais la correction à l'arrache d'une exercice que tu cherches ?
    Perdu ! Justement non, c'est le contraire mais disons que je n'ai pas une flexibilité redoutable ...

    Citation Envoyé par 3DArchi Voir le message
    Tu peux te baser sur std::bitset si le nombre de bit est fixe (par exemple car lié à un en-tête fixe de protocole)
    Effectivement le nb de bits est fixe car lié à une norme, tu penses que c'est une bonne solution ?

    Citation Envoyé par 3DArchi Voir le message
    ou std::vector<bool> (mais à manier avec précaution car différent d'un std::vector dans la continuité du buffer) pour la construction d'un 'pack' de bits. Te reste à écrire une fonction de sérialisation depuis le conteneur vers un buffer de byte (std::vector<unsigned char>), sérialisation assez triviale, à coup de décalage de bits (y'a pas de contrepèterie) et de masques.

    Ou sinon, c'est tout à la main : un std::vector<unsigned char> pour le buffer, une/des fonctions pour convertir un entier vers des bits (toujours masque + décalage et toujours pas de contrepèterie), un état courant sur le nombre de bits de l'octet en cours de construction, une politique de padding si au final c'est pas un multiple de huit, et roule ma poule
    C'est justement exactement ce que je pensais faire mais c'est là que ca ne roule pas et que ça coince ...

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/05/2010, 13h51
  2. [VB6] Ecrire une requete SQL sur plusieurs lignes!
    Par big x dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 08/05/2006, 16h28
  3. radiobutton erreur n'est pas une valeur entière correcte
    Par pierrot67 dans le forum Bases de données
    Réponses: 3
    Dernier message: 12/03/2006, 21h27
  4. erreur '' n'est pas une valeur entière correcte
    Par ffxlenoir dans le forum Langage
    Réponses: 5
    Dernier message: 02/12/2005, 13h57
  5. Ecrire une requete SQL sur plusieurs lignes
    Par PrinceMaster77 dans le forum ASP
    Réponses: 2
    Dernier message: 15/11/2004, 14h47

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