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

  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 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
    Il suffit de lire et d'écrire la structure élément par élément et non pas d'un seul bloc pour éviter les problèmes d'alignement différents.

  8. #8
    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).

  9. #9
    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 Mac LAK Voir le message
    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 pas une question de compilateur, mais de machine. Un Power PC (et toute machine Freescale en général) ne sait pas adresser un word à une adresse impaire, donc le mode 'packed' n'existe pas sur un compilateur pour Power PC.

    Un x86 sait le faire, mais au prix d'un ralentissement, car l'accès se fait en 2 x 8-bit au lieu de 1 x 16-bit.

  10. #10
    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 diogene Voir le message
    Il suffit de lire et d'écrire la structure élément par élément et non pas d'un seul bloc pour éviter les problèmes d'alignement différents.
    Ca ne change rien. Les solutions sont connues et ont été exposées des zillions de fois : texte (CSV, XML etc.) ou binaire indépendant (TLV, BER, XDR ...)

  11. #11
    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 Emmanuel Delahaye Voir le message
    C'est pas une question de compilateur, mais de machine. Un Power PC (et toute machine Freescale en général) ne sait pas adresser un word à une adresse impaire, donc le mode 'packed' n'existe pas sur un compilateur pour Power PC.
    Heu... Non.

    J'ai des cartes CPU PowerPC qui tournent avec des structures alignées sur un octet, et ça marche très bien, avec du code portable x86 Windows / x86 Linux / PPC sous *nix.
    Et vu que c'est du code qui reconstruit "à la main", entre autres, des entêtes IP/UDP et des flux de bits, je peux te garantir que c'est bien aligné à l'octet...

    Par contre, j'ai déjà eu la farce (et qui faisait mal) avec des processeurs Sparc, qui sont ultra sensibles à ce niveau... Et encore !! Tant que c'est généré par le compilateur, via une structure par exemple, il se débrouille correctement pour éviter les Bus Error. Par contre, quand on tape "à la main" de façon non alignée, ça explose.

    De façon générale, tout dépend du compilateur, s'il génère (ou non !) le code requis pour passer les barrières d'alignement... C'est TOUJOURS le cas avec les structures / unions, ça ne l'est jamais par contre pour un flux lu n'importe comment.
    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

  12. #12
    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 Mac LAK Voir le message
    Heu... Non.

    J'ai des cartes CPU PowerPC qui tournent avec des structures alignées sur un octet, et ça marche très bien, avec du code portable x86 Windows / x86 Linux / PPC sous *nix.
    Oui, effectivement, ça dépend si on câble ou non le fil de séparation de octets hauts et bas (dont j'ai oublié le nom). Sur les architectures que j'utilisais en télecom, il n'était pas cablé, donc impossible d'adresser un word à une adresse impaire... (BERR)

  13. #13
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Cela me rappelle la macro UNALIGNED sous Visual, qui sert justement à dire au compilateur de faire la cuisine nécessaire...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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