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));
}