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 :

Lecture d'un ushort à partir d'un IntPtr


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2005
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 53
    Par défaut Lecture d'un ushort à partir d'un IntPtr
    Bonjour, petite réflexion sur la lecture d'un ushort à partir d'un IntPtr qui point sur un tableau de ushort.

    Je voudrai faire une fonction dans le même état d'esprits que : short Marshal.ReadInt16(IntPtr ptr, int ofs)

    Pour commencer avec les pointeurs c'est facile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ushort ReadUInt16(IntPtr source, int offset)
    {
       unsafe
       {
          return *(ushort*)(source + offset);
       }
    }
    Mais je voudrai plutôt essayer de m'en passer et faire du code "safe".

    Voici quelques fonctions qui marche toutes mais il y en a aucune que je trouve vraiment jolie, des avis sur la "plus jolie" ou d'autres exemples ?

    Exemple 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ushort ReadUInt16(IntPtr source, int offset)
    {
       short[] sValue = { 0 };
       ushort[] uValue = { 0 };
       sValue[0] = Marshal.ReadInt16(source, offset);
       Buffer.BlockCopy(sValue, 0, uValue, 0, 2);
       return uValue[0];
    }
    Exemple 2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ushort ReadUInt16(IntPtr source, int offset)
    {
       return (ushort)(Marshal.ReadByte(source, offset) + Marshal.ReadByte(source, offset + 1) * 256);
    }
    Exemple 3:
    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
    ushort ReadUInt16(IntPtr source, int offset)
    {
       return UInt16Converter.Convert(Marshal.ReadInt16(source, offset));
    }
     
    [StructLayout(LayoutKind.Explicit)]
    struct UInt16Converter
    {
       [FieldOffset(0)]
       short ShortValue;
       [FieldOffset(0)]
       ushort UShortValue;
     
       public static ushort Convert(short source)
       {
          var converter = new UInt16Converter();
          converter.ShortValue = source;
          return converter.UShortValue;
       }
    }
    Exemple 4:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ushort ReadUInt16(IntPtr source, int offset)
    {
       short[] sValue = { 0 };
       sValue[0] = Marshal.ReadInt16(source, offset);
       return ((ushort[])(object)sValue)[0];
    }
    Exemple 5 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ushort ReadUInt16(IntPtr source, int offset)
    {
       return (ushort)Marshal.PtrToStructure(source + offset, typeof(ushort));
    }

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

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

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Par défaut
    Ca fonctionne pas ça ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ushort ReadUInt16(IntPtr source, int offset)
            {
                return (ushort)Marshal.ReadInt16(source, offset);
            }

  3. #3
    Membre confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2005
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 53
    Par défaut
    Heu si j'étais perdu dans d'autre problèmes que je vois plus les choses simples

    Ce qui ma perdu c'est que la fonction Marshal.Copy() ne prenne pas les ushort[] mais un cast suffit aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Marshal.Copy(source, (short[])(object)destination, startIndex, length);

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

Discussions similaires

  1. lecture de donnes a partir d'un PDF
    Par medhioub.h dans le forum Documents
    Réponses: 2
    Dernier message: 27/07/2007, 15h38
  2. Lecture d'un fichier à partir de la nième ligne
    Par May69 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 17/02/2007, 09h29
  3. Lecture d'un fichier à partir d'un formulaire
    Par Dirty Harry dans le forum Langage
    Réponses: 7
    Dernier message: 01/02/2007, 16h39
  4. Lecture d'un XML à partir d'une URL
    Par staive dans le forum Langage
    Réponses: 10
    Dernier message: 10/01/2007, 17h31
  5. lecture de données a partir de fichier
    Par sana dans le forum MFC
    Réponses: 5
    Dernier message: 21/01/2004, 12h57

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