Maison >développement back-end >C++ >Comment convertir efficacement les structures de données C/C des tableaux d'octets en structures C# ?

Comment convertir efficacement les structures de données C/C des tableaux d'octets en structures C# ?

DDD
DDDoriginal
2025-01-19 07:24:11825parcourir

How to Efficiently Convert C/C   Data Structures from Byte Arrays to C# Structures?

Lire la structure de données C/C du tableau d'octets vers 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.

Utilisez Marshal.PtrToStructure

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>

Version universelle

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>

Version simplifiée

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>

Comparaison de BinaryReader et Marshal.PtrToStructure

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!

Déclaration:
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