Maison >développement back-end >C++ >Comment convertir efficacement une structure de données C/C d'un tableau d'octets en une structure C# ?
Lire la structure de données C/C du tableau d'octets vers C#
Cet article décrit comment remplir des données de tableau d'octets dérivées de structures C/C dans des structures C#.
Utilisation de GCHandle et Marshal
Cette méthode se divise en trois étapes :
GCHandle.Alloc
pour corriger l'emplacement du tableau d'octets en mémoire. Marshal.PtrToStructure
pour convertir une adresse mémoire fixe en une instance NewStuff
. handle.Free()
pour libérer GCHandle
. Code simplifié :
<code class="language-csharp">NewStuff ByteArrayToNewStuff(byte[] bytes) { GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); NewStuff stuff; try { stuff = (NewStuff)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(NewStuff)); } finally { handle.Free(); } return stuff; }</code>
Version générique :
<code class="language-csharp">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; }</code>
Version plus simplifiée (nécessite un bloc de code non sécurisé) :
<code class="language-csharp">unsafe T ByteArrayToStructure<T>(byte[] bytes) where T : struct { fixed (byte* ptr = &bytes[0]) { return (T)Marshal.PtrToStructure((IntPtr)ptr, typeof(T)); } }</code>
Méthode BinaryReader
L'utilisation de BinaryReader
n'est peut-être pas plus performante que la méthode Marshal
. Les deux méthodes nécessitent que les données soient correctement disposées et dimensionnées pour être converties avec succès en une structure NewStuff
.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!