Si vous avez un byte[], vous devriez pouvoir utiliser la classe BinaryReader et définir des valeurs sur NewStuff à l'aide des méthodes ReadX disponibles.
Quel serait le meilleur moyen de remplir un C
Si vous avez un byte[], vous devriez pouvoir utiliser la classe BinaryReader et définir des valeurs sur NewStuff à l'aide des méthodes ReadX disponibles.
D'après ce que je peux voir dans ce contexte, vous n'avez pas besoin de copier SomeByteArray
dans un tampon. Vous devez simplement obtenir le handle de SomeByteArray
, l'épingler, copier les données IntPtr
en utilisant PtrToStructure
puis relâcher. Pas besoin de copie.
Ce serait :
NewStuff ByteArrayToNewStuff(byte[] bytes)
{
GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
try
{
NewStuff stuff = (NewStuff)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(NewStuff));
}
finally
{
handle.Free();
}
return stuff;
}
Version générique :
T ByteArrayToStructure<T>(byte[] bytes) where T: struct
{
T stuff;
GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
try
{
stuff = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
}
finally
{
handle.Free();
}
return stuff;
}
Version simplifiée (nécessite le commutateur unsafe
) :
unsafe T ByteArrayToStructure<T>(byte[] bytes) where T : struct
{
fixed (byte* ptr = &bytes[0])
{
return (T)Marshal.PtrToStructure((IntPtr)ptr, typeof(T));
}
}
Attention aux problèmes d'emballage. Dans l'exemple que vous avez donné, tous les champs sont aux décalages évidents car tout est sur des limites de 4 octets, mais ce ne sera pas toujours le cas. Packs Visual C sur des limites de 8 octets par défaut.