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

VB.NET Discussion :

[VB.NET]Comment mapper tableau d'octets dans une structure?


Sujet :

VB.NET

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [VB.NET]Comment mapper tableau d'octets dans une structure?
    J'utilise VB.NET 2005 PRO sous XP SP2

    Le probleme :
    ----------------
    Je recupère des données mémoire dans un tableau d'octets (1 dimension)
    J'ai besoin de 'mapper' ce tableau sur une instance de structure.
    Bien sur la taille du tableau est égale à la taille de la structure.
    Je précise que la structure et le tableau d'octets appartiennent à la mémoire 'managée'.
    Ma structure comporte des types integer, byte et single.

    La solution :
    --------------
    Quequ'un aurait il une idée ?
    Y aurait-il une facon d'acceder octet par octet à la structure.

    Les remerciements :
    ------------------------
    Merci d'avance

    Erick

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Tu peux utiliser des attributs StructLayoutAttribute et FieldOffsetAttribute dans la définition de ta structure.
    Cela permet de créer l'équivalent d'une union.
    On ne peut pas faire boire un âne qui n'a pas soif.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    J'ai l'impression que tu cherches a serialiser/deserialiser tes objets en binaires, et je crois qu'en .net il y a des choses de prévues pour ça. Regarde du coté de la classe BinaryFormatter (http://msdn.microsoft.com/library/de...classtopic.asp) .

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour vos réponses mais elles ne resolvent pas mon pb.

    1) Pour les atrributs de déclaration de structures elles sont nécessaires car en effet elles garantissent la continuité des données en mémoire, mais cela ne resout pas mon probleme de mappage.

    2) Pour la serialisation j'ai testé mais cela ne m'interesse pas car le nom des champs est sérialisé avec les données et pour un structure de 50 octets environ je me retrouve avec des données sérialisées de 1,5 ko.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Bizarre, effectivement il doit y avoir de "l'overhead" avec le binary formater, il insere des infos sur la version, sur le type des champs etc... mais je pensais pas que le rapport était aussi eléve (30 là qd meme).

    En flanant sur google je suis tombé sur ça :
    http://groups.google.fr/group/microsoft.public.dotnet.languages.csharp/browse_thread/thread/93e1cb5e03f2431/11ca178c9bf72da6?lnk=st&q=BinaryFormatter+serializing+struct+member+names&rnum=2&hl=fr#11ca178c9bf72da6

    ça m'a l'air un peu plus rock'n roll , regarde si ça correspond à ce que tu veux faire.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Voilà un exemple fonctionnel en C#.

    Déclaration d'une structure Union :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    using System.Runtime.InteropServices;
         [StructLayout(LayoutKind.Explicit)]
        unsafe public struct Union
            {
            [FieldOffset(0)]
            public fixed Byte tabByte[4];  //point de remplissage de la structure
            [FieldOffset(0)]
            public Int32 i; //4 octets
            [FieldOffset(0)]
            public Int16 j; //2 octets
            [FieldOffset(0)]
            public Byte k; //1 octet
            }
    Cette structure peut être remplie à partir d'un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
           unsafe static void Main() {
                Union myUnion;
                Byte[] inputBytes = new Byte[4] { 0x0D, 0x0C, 0x0B, 0x0A};
                for (int i = 0; i < 4; i++) myUnion.tabByte[i] = inputBytes[i];
                //résultat :
                    //myUnion.i = 0x0A0B0C0D
                    //myUnion.j = 0x0C0D
                    //myUnion.k = 0x0D
     //...
                }
    On ne peut pas faire boire un âne qui n'a pas soif.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour ces infos
    Pour ma part je ne suis pas resté inactif et j'ai trouvé cette classe qui résout en partie mon probleme : BitConverter
    BitConverter.ToInt16(TabByte, Offset)
    BitConverter.ToInt32(TabByte, Offset)
    BitConverter.ToInt64(TabByte, Offset)
    BitConverter.ToSingle(TabByte, Offset)
    ....
    etc
    TabByte etant un tableau d'octets et Offset, l'offset dans se tableau
    Example :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim MySingle As Single 
    MySingle =  BitConverter.ToSingle(TabByte, 0)
    qui permet de convertir par exemple les 4 premiers octets du tableau TabByte en un single
    et inversement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim MySingle As Single = 3.14
    Dim TabByte() As Byte = BitConverter.GetBytes(MySingle)
    Encore merci à tous

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

Discussions similaires

  1. Tableau non contraint dans une structure
    Par chronos dans le forum C
    Réponses: 8
    Dernier message: 07/06/2007, 17h44
  2. Réponses: 2
    Dernier message: 19/02/2007, 15h46
  3. Réponses: 9
    Dernier message: 13/04/2006, 11h40
  4. Réponses: 5
    Dernier message: 27/04/2005, 16h49
  5. [Kylix] stockage d'un tableau d'octets dans interbase
    Par georges1001 dans le forum EDI
    Réponses: 1
    Dernier message: 16/09/2003, 14h14

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