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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    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 : 40
    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
    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

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    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.

  3. #3
    Membre éprouvé
    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 : 40
    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
    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

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    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.

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 497
    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 Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    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 éprouvé
    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 : 40
    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
    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