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 :
Mais je voudrai plutôt essayer de m'en passer et faire du code "safe".
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); } }
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:
Exemple 2:
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 3:
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 4:
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 5 :
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]; }
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)); }
Partager