Maison >développement back-end >C++ >Comment analyser efficacement les structures C/C à partir de tableaux d'octets en C# ?
Analyse des structures C/C à partir de tableaux d'octets en C#
Lorsque vous traitez des structures de données de C ou C en C#, il est crucial d'analyser et d'interpréter leur contenu efficacement. Une tâche courante consiste à convertir une structure C/C stockée sous forme de tableau d'octets en la structure C# correspondante.
Bonnes pratiques pour la réplication des données
La méthode la plus directe consiste à utiliser GCHandle
pour fixer l'emplacement du tableau d'octets en mémoire, à utiliser Marshal.PtrToStructure
pour convertir le pointeur fixe en structure, et enfin à relâcher le handle fixe. Cette méthode est relativement efficace et garantit que les données sont copiées du tableau d'octets vers la structure C#.
<code class="language-csharp">GCHandle handle = GCHandle.Alloc(byte_array, GCHandleType.Pinned); NewStuff stuff = (NewStuff)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(NewStuff)); handle.Free();</code>
Génériques et options dangereuses
Pour que cette méthode fonctionne pour des structures de différentes tailles, vous pouvez écrire une fonction générique comme celle-ci :
<code class="language-csharp">T ByteArrayToStructure<T>(byte[] bytes) where T : struct { GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); try { T stuff = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T)); return stuff; } finally { handle.Free(); } }</code>
Ou, pour une syntaxe plus propre, vous pouvez utiliser la version non sécurisée :
<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>
Ces méthodes fournissent un moyen pratique et efficace d'analyser les structures C/C à partir de tableaux d'octets en C#.
Notes sur les performances de BinaryReader
Bien qu'il soit possible d'utiliser la classe BinaryReader
pour accomplir cette tâche, il est peu probable qu'elle génère une amélioration significative des performances par rapport à la méthode Marshal.PtrToStructure
. Les deux méthodes impliquent d’épingler le tableau d’octets en mémoire et d’accéder directement aux données sous-jacentes, ce qui entraîne une surcharge similaire.
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!