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 :

Conversion Byte[] vers structure avec Big-endian


Sujet :

C#

  1. #1
    Membre confirmé
    Avatar de irnbru
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2004
    Messages : 316
    Points : 500
    Points
    500
    Billets dans le blog
    1
    Par défaut Conversion Byte[] vers structure avec Big-endian
    Bonjour à tous, j'espère ne pas me tromper sur la catégorie du forum pour ma question

    Je souhaitais savoir comment est il possible de coder en c# ma structure chargée de récupérer des données brutes en byte[] sachant que toutes les données brutes sont stockées avec l'ordonnancement Big-Endian byte ordering...

    Par exemple le premier champs AtomSize contenu 4 bytes, pourait avoir la valeur suivante en hexa:

    00 00 00 20

    Normalement en Big-Endian le poids le plus faible est mis en dernière position, on aurait donc la valeur décimale suivante:

    AtomeSize = 2 * 16 + 0 * 1 = 32

    Hors en C# l'ordonnancement des bytes serait Little-Endian.
    C'est l'inverse avec le poids le plus fort en dernier....

    En conséquence j'ai comme résultat non souhaité (représenté ici sous la forme big-endian pour éviter la confusion) :

    20 00 00 00 soit 536870912 en décimal au lieu de 32 attendu!

    Comment à l'aide d'attribut sur la struct préciser qu'elle ne contiendra que des données au format big-endian?

    Merci beaucoup pour toute aide.

    IRNBRU



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
      [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi)]
        public struct FileTypeCompatibility
        {
     
     
            [FieldOffset(0)]
            public int AtomSize;
        }

  2. #2
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut

    Il est nécessaire de connaitre les sequence de types dans ta structure

    Personnellement j'utilise un BinaryReader et la methode HostToNetworkOrder dans la Classe IPAddress

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // br est un BinaryReader
     int X = IPAddress.HostToNetworkOrder(br.ReadInt32());
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  3. #3
    Membre confirmé
    Avatar de irnbru
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2004
    Messages : 316
    Points : 500
    Points
    500
    Billets dans le blog
    1
    Par défaut
    Merci pour ta contribution olibara.

    N'est-il pas possible de faire la conversion à la volée sur la structure?

    Là je suis obligé de faire (sachant que "value" est une propriété de ma structure):

    IPAddress.NetworkToHostOrder(value) pour chaque propriété de ma structure avant de consulter cette propriété.

    Merci encore

    IRNBRU

  4. #4
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut

    Là je suis obligé de faire (sachant que "value" est une propriété de ma structure):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IPAddress.NetworkToostOrder(value)
    pour chaque propriété de ma structure avant de consulter cette propriété.
    Tout dépends du role de cette structure et de sa rémanence

    D'ou viennent tes données et qu'en fait tu ?
    Si c'est possible pu peux lire ta source de maniere sequentielle et transferer dans une classe Little-Endian
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  5. #5
    Membre confirmé
    Avatar de irnbru
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2004
    Messages : 316
    Points : 500
    Points
    500
    Billets dans le blog
    1
    Par défaut
    En fait je dois lire une flux en binaire d'une vidéo mp4, cette vidéo est constitué d'atomes (structure spéciale).

    Ma structure doit représenter ces atomes.
    Toutes les données binaires d'une vidéo mp4 sont encodée en big-endian.

    "Unless otherwise stated,
    all data in a QuickTime movie is stored in big-endian byte ordering, also known as network byte ordering, in
    which the most significant bytes are stored and transmitted first."
    Mon but est de récupérer les données des atomes, de parcourir ces atomes un par un et de récupérer des données métadata comme la hauteur ou la largeur de cette vidéo, ces info étant contenus dans l'atome adéquat

    voilà

  6. #6
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Je vois

    Mais effectivement du dois swaper chaque element individuellement
    Et faire la distinction entre un short et un INT

    Pour la performance C je ferais ca des des sequences de XOR sur des pointeurs de bytes
    En Csharp tu pourrais aussi faire des XOR sur les bytes d'un Array
    Il serait intéressant de voir NetworkToostOrder execute le Swapping
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  7. #7
    Membre confirmé
    Avatar de irnbru
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2004
    Messages : 316
    Points : 500
    Points
    500
    Billets dans le blog
    1
    Par défaut
    C'est étrange, je pense que les transformations implémentées par la méthodes HostToNetworkOrder sont réversibles du coup en appelant 2 fois HostToNetworkOrder on reviendrait au point de départ

    Je vois que l'on peut définir BIGENDIAN comme directive? Est-il possible de dire au compilateur d'interpréter le flux binaire en tant que big endian au lieu du little endian par défaut?


    public static long NetworkToHostOrder(long network) {
    return HostToNetworkOrder(network);
    }
    public static int NetworkToHostOrder(int network) {
    return HostToNetworkOrder(network);
    }
    public static short NetworkToHostOrder(short network) {
    return HostToNetworkOrder(network);
    }



    public static long HostToNetworkOrder(long host) {
    #if BIGENDIAN
    return host;
    #else
    return (((long)HostToNetworkOrder((int)host) & 0xFFFFFFFF) << 32)
    | ((long)HostToNetworkOrder((int)(host >> 32)) & 0xFFFFFFFF);
    #endif
    }
    public static int HostToNetworkOrder(int host) {
    #if BIGENDIAN
    return host;
    #else
    return (((int)HostToNetworkOrder((short)host) & 0xFFFF) << 16)
    | ((int)HostToNetworkOrder((short)(host >> 16)) & 0xFFFF);
    #endif
    }
    public static short HostToNetworkOrder(short host) {
    #if BIGENDIAN
    return host;
    #else
    return (short)((((int)host & 0xFF) << 8) | (int)((host >> 8) & 0xFF));
    #endif
    }

    En tout cas c'est frustrant de ne pas être en mesure de traduire mes atomes en mes structures correctement transformées pour représenter correctement les données en little endian....

    j'ai trouvé un article intéressant, pourquoi ne pas dériver la classe chargée de récupérer le binaire et demander de renverser les binaires

    http://dismantledtech.wordpress.com/...inary-streams/

Discussions similaires

  1. Conversion byte vers réel en Delphi7
    Par delphino7 dans le forum Langage
    Réponses: 3
    Dernier message: 03/05/2008, 15h25
  2. conversion Byte[] vers int
    Par skud dans le forum C#
    Réponses: 5
    Dernier message: 17/05/2007, 12h14
  3. Réponses: 2
    Dernier message: 18/02/2007, 01h47
  4. Conversion timestamp vers date avec oracle 9.2
    Par gaboo_bl dans le forum Oracle
    Réponses: 5
    Dernier message: 27/11/2006, 14h10
  5. Pb avec "BIG ENDIAN"
    Par pdgnr dans le forum Delphi
    Réponses: 2
    Dernier message: 04/09/2006, 09h37

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