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 un bloc binaire selon un certain format


Sujet :

C

  1. #1
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut Ecrire un bloc binaire selon un certain format
    Bonjour,
    J'ai besoin d'écrire un bloc binaire dans un buffer avec une structure précise. C'est à dire, un en-tête avec plusieurs champs de taille fixe et un champ variable, puis différents champs de données avec à chaque fois un petit en-tête fixe et une valeur de taille variable ensuite. En C++ j'aurais simplement balancé ça dans un flux dans le bon ordre, mais connaissant mal le C j'aimerais savoir s'il existe une bonne pratique pour faire ça.

    Mon idée est simplement d'allouer mon buffer puis écrire mes valeurs au fur et à mesure en incrémentant un offset, mais il y a peut être une meilleure façon de faire ?
    Pour l'écriture memcpy pour les chaines de caractères (sachant que je ne dois pas les terminer par null), et peut être une affectation de type buffer[offset] = 0x10; buffer[offset+1] = 0x20; pour les valeurs binaires fixes ?

    Merci d'avance

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    c'est la méthode classique.
    Il faut juste veiller à utiliser un unsigned char* ou un signed char*.

    Par contre, en théorie, il faudrait utiliser la macro CHAR_BITS (si c'est bien son nom) pour savoir combien de bits occupe un char, et travailler avec les décalages et autres.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Est-ce qu'il ne vaut pas mieux utiliser le type uint8_t du coup quand on veut écrire un octet ?

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Il me semble, le uint8_t n'est pas toujours défini.
    Sur certains systèmes, le char fait 16 bits, et tout type est nécessairement plus grand que char.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Il me semble, le uint8_t n'est pas toujours défini.
    C'est vrai. Les types de largeur fixe ne sont pas obligatoires. Voir la norme C99 (document n1256), section 7.18.1.1 Exact-width integer types, point 3.

  6. #6
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Citation Envoyé par ymoreau Voir le message
    Bonjour,
    J'ai besoin d'écrire un bloc binaire dans un buffer avec une structure précise. C'est à dire, un en-tête avec plusieurs champs de taille fixe et un champ variable, puis différents champs de données avec à chaque fois un petit en-tête fixe et une valeur de taille variable ensuite. En C++ j'aurais simplement balancé ça dans un flux dans le bon ordre, mais connaissant mal le C j'aimerais savoir s'il existe une bonne pratique pour faire ça.
    Bonjour,
    oui tu peux faire la même chose. Pour être un peu plus exhaustif tu peux éventuellement ajouter un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #ifdef CHAR_BIT
    #  if CHAR_BIT != 8
    #    error "platform unsupported"
    #  endif
    #else
    #  warning "Unknown char width, assuming char is 8bit wide"
    #endif
    juste pour vérifier lors de la compilation que la plateforme pour laquelle tu compiles possède bien des char de 8 bits (ils ne peuvent pas faire moins).

    Si tu tiens à pouvoir compiler ton programme même sur certains Cray où CHAR_BIT vaut 64, alors il te faudra passer par des bit fields.

    Citation Envoyé par ymoreau Voir le message
    Mon idée est simplement d'allouer mon buffer puis écrire mes valeurs au fur et à mesure en incrémentant un offset, mais il y a peut être une meilleure façon de faire ?
    Pour l'écriture memcpy pour les chaines de caractères (sachant que je ne dois pas les terminer par null), et peut être une affectation de type buffer[offset] = 0x10; buffer[offset+1] = 0x20; pour les valeurs binaires fixes ?

    Merci d'avance
    Si tu ne cibles que des plateformes où tu es certain de trouver la glibc tu peux aussi utiliser l'extension obstack.

  7. #7
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Citation Envoyé par picodev Voir le message
    Si tu ne cibles que des plateformes où tu es certain de trouver la glibc tu peux aussi utiliser l'extension obstack.
    Merci, je ne sais pas pour glibc il faudrait que je me renseigne. Mais vu que mon format de données est plutôt petit et ne varie presque pas (2 chaînes de taille variable, le reste est de taille fixe et dans un ordre fixe) je ne sais pas s'il y a beaucoup à gagner.

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

Discussions similaires

  1. Ecrire dans un fichier avec un certains format
    Par nekcorp dans le forum Général Python
    Réponses: 5
    Dernier message: 24/04/2014, 11h50
  2. Réponses: 13
    Dernier message: 21/06/2006, 19h36
  3. Réponses: 6
    Dernier message: 17/12/2005, 19h27
  4. Réponses: 44
    Dernier message: 19/10/2005, 10h54
  5. [langage] Ecrire un bloc de texte dans un fichier
    Par sarahbes dans le forum Langage
    Réponses: 6
    Dernier message: 10/06/2004, 11h40

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