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
Libérer: 2025-01-19 07:24:11
original
891 Les gens l'ont consulté

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#.

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();
    }
}
Copier après la connexion

Version universelle

Cette version générique permet la conversion de n'importe quel type de structure à partir d'un tableau d'octets :

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();
    }
}
Copier après la connexion

Version simplifiée

Pour les applications simples, utilisez des tableaux fixes non sécurisés :

unsafe T ByteArrayToStructure<T>(byte[] bytes) where T : struct
{
    fixed (byte* ptr = &bytes[0])
    {
        return (T)Marshal.PtrToStructure((IntPtr)ptr, typeof(T));
    }
}
Copier après la connexion

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 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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal