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 :

Endianness et structures


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 5
    Par défaut Endianness et structures
    Bonsoir,


    Encore un probleme d'endianness.
    En gros, que fait mon programme, il a une suite de structures bien remplies comme il faut, qu'il ecrit dans un fichier les unes a la suite des autres.
    Ce ficher sera ensuite relu plus tard.
    Donc pas de probleme d'endianness si il reste sur le meme type d'endian. Mais si je mets ce fichier sur une machine big endian, impossible de le relire correctement.

    Il faut donc que je le passe en network order.

    Or, voila mon probleme, je ne comprends pas, comment passer toute ma struct en network order. Elle contient notamment des char [].

    Voici la struct en question:


    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
     
     
    typedef struct s_toto_info {
        uint32_t start_offset;
        uint32_t size;
        t_MODE MODE;
        t_TYPE TYPE;
        t_LANG LANG;
        t_OS OS;
        mode_t perms;
        char description[256];
    } t_toto_info;
     
    typedef struct s_toto_index {
        int id;
        char path[MAXPATHLEN];
        struct s_toto_info info;
    } t_toto_index;
    Comment htonl mon char description[256] our mon char path[MAXPATHLEN] par exemple ?


    Merci.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 5
    Par défaut
    Je pense avoir trouve, je fais quelque chose du style:

    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
    t_toto_index *toto_ntohl(t_toto_index *src)
    {
        uint32_t tmp;
        size_t i;
    
        src->id = ntohl(src->id);
        src->info.LANG = ntohl(src->info.LANG);
        src->info.MODE = ntohl(src->info.MODE);
        src->info.OS = ntohl(src->info.OS);
        src->info.TYPE = ntohl(src->info.TYPE);
        src->info.size = ntohl(src->info.size);
        src->info.perms = ntohl(src->info.perms);
        src->info.start_offset = ntohl(src->info.start_offset);
    
        for (i = 0; i < sizeof(src->fullPath); ++i) {
            memcpy(&tmp, src->fullPath + i,sizeof (tmp));
            tmp = ntohl(tmp) ;                                                                                                                                            
            memcpy(src->fullPath + i, &tmp, sizeof (tmp));
        }
        return src;
    }

    Merci.


    EDIT: En fait, ca semble faux. Dites moi ce que vous en pensez.

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Cette question d'endian concerne les données codées sur plus d'un byte. Comme chaque élément d'un char [] est sur 1 byte, il suffit de les copier dans l'ordre où ils sont. La question serait différente pour un int[] par exemple, où chaque int du tableau devrait subir la transformation avant copie.

    Par contre, tu devrais être attentif à la question de l'alignement des éléments d'une structure si tu es soucieux de la portabilité de ton fichier.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 5
    Par défaut
    Effectivement, c'est bien ce que je pensais a la base. Tant que c'est moins d'un byte, ya pas de question a se poser. Mais voyant que le comportement de mon programme etait different sur une machine ppc, j'en ai conclu trop rapidement que ca venait de la.

    Pour ce qui est de l'alignement, ma struct est attributed packed.


    Merci de ton aide en tout cas.

  5. #5
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par bariole Voir le message
    Pour ce qui est de l'alignement, ma struct est attributed packed.
    Justement, tu perds en portabilité avec ça, rien ne dit que les environnements qui vont interagir avec ton appli disposent d'un compilateur capable de faire la même chose.

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Justement, tu perds en portabilité avec ça, rien ne dit que les environnements qui vont interagir avec ton appli disposent d'un compilateur capable de faire la même chose.
    Il est quand même plus que rare qu'un compilateur C, dédié à la base à faire du code bas niveau, ne permette pas d'aligner les structures sur un octet... C'est fréquent dans les langages de haut niveau, mais le C est rarement touché par ce problème.

    Même s'il est parfois nécessaire de convertir la structure "machine" vers une structure de haut niveau (=alignée sur des mots machine et/ou convertie en quelque chose de portable, genre texte / XML) pour pouvoir l'utiliser dans d'autres langages...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par bariole Voir le message
    Effectivement, c'est bien ce que je pensais a la base. Tant que c'est moins d'un byte, ya pas de question a se poser. Mais voyant que le comportement de mon programme etait different sur une machine ppc, j'en ai conclu trop rapidement que ca venait de la.

    Pour ce qui est de l'alignement, ma struct est attributed packed.
    Packed ne fonctionne pas sur PowerPC...

    Il y a 2 façons de faire des enregistrements portables. Le mode texte (Simple, 98% portable en ASCII, facile à transcoder en EBCDIC pour les 2% restants...) et un mode binaire indépendant de toute architecture (complexe, 100% portable).

Discussions similaires

  1. Réponses: 6
    Dernier message: 26/12/2012, 11h19
  2. Réponses: 23
    Dernier message: 13/02/2009, 12h31
  3. recuperation de la structure d'une base
    Par pascalT dans le forum 4D
    Réponses: 7
    Dernier message: 07/06/2006, 15h32
  4. Structure de données de type "RECORD"
    Par chaours dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 30/09/2002, 17h10
  5. longueur d'une structure
    Par bohemianvirtual dans le forum C
    Réponses: 6
    Dernier message: 28/05/2002, 18h31

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