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:
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:
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:
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:
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:
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:
1 2 3 4
| ushort ReadUInt16(IntPtr source, int offset)
{
return (ushort)Marshal.PtrToStructure(source + offset, typeof(ushort));
} |