Maison > développement back-end > C++ > Comment analyser efficacement les structures C/C à partir de tableaux d'octets en C# ?

Comment analyser efficacement les structures C/C à partir de tableaux d'octets en C# ?

Patricia Arquette
Libérer: 2025-01-19 06:04:14
original
442 Les gens l'ont consulté

How to Efficiently Parse C/C   Structures from Byte Arrays in 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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal