Maison >développement back-end >C++ >Comment convertir efficacement les structures de données C/C des tableaux d'octets en structures C# ?
En C#, lors de la réception de données de tableau d'octets à partir d'une structure C/C, vous devez convertir le tableau en une structure C# compatible. Les méthodes suivantes fournissent un chemin de conversion efficace.
Cette méthode consiste à réparer un tableau d'octets et à utiliser Marshal.PtrToStructure pour convertir les octets directement en une structure C#.
<code class="language-csharp">NewStuff ByteArrayToNewStuff(byte[] bytes) { GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); try { NewStuff stuff = (NewStuff)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(NewStuff)); return stuff; } finally { handle.Free(); } }</code>
Cette version générique permet la conversion de n'importe quel type de structure à partir d'un tableau d'octets :
<code class="language-csharp">T ByteArrayToStructure<T>(byte[] bytes) where T : struct { GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); try { return (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T)); } finally { handle.Free(); } }</code>
Pour les applications simples, utilisez des tableaux fixes non sécurisés :
<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>
BinaryReader fonctionne de manière similaire à Marshal.PtrToStructure, permettant de lire des données à partir de tableaux d'octets. Cependant, cela entraîne une surcharge supplémentaire et n'est généralement pas recommandé pour les applications critiques en termes de performances. Marshal.PtrToStructure fonctionne directement sur les octets bruts sans conversion intermédiaire, les performances sont donc plus rapides.
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!