Maison >développement back-end >C++ >Comment convertir efficacement une structure de données C/C d'un tableau d'octets en une structure C# ?

Comment convertir efficacement une structure de données C/C d'un tableau d'octets en une structure C# ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-19 07:36:10601parcourir

How to Efficiently Convert a C/C   Data Structure from a Byte Array to a C# Struct?

Lire la structure de données C/C du tableau d'octets vers C#

Cet article décrit comment remplir des données de tableau d'octets dérivées de structures C/C dans des structures C#.

Utilisation de GCHandle et Marshal

Cette méthode se divise en trois étapes :

  1. Utilisez GCHandle.Alloc pour corriger l'emplacement du tableau d'octets en mémoire.
  2. Utilisez Marshal.PtrToStructure pour convertir une adresse mémoire fixe en une instance NewStuff.
  3. Une fois la conversion terminée, utilisez handle.Free() pour libérer GCHandle.

Code simplifié :

<code class="language-csharp">NewStuff ByteArrayToNewStuff(byte[] bytes)
{
    GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
    NewStuff stuff;
    try
    {
        stuff = (NewStuff)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(NewStuff));
    }
    finally
    {
        handle.Free();
    }
    return stuff;
}</code>

Version générique :

<code class="language-csharp">T ByteArrayToStructure<T>(byte[] bytes) where T : struct
{
    T stuff;
    GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
    try
    {
        stuff = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
    }
    finally
    {
        handle.Free();
    }
    return stuff;
}</code>

Version plus simplifiée (nécessite un bloc de code non sécurisé) :

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

Méthode BinaryReader

L'utilisation de BinaryReader n'est peut-être pas plus performante que la méthode Marshal. Les deux méthodes nécessitent que les données soient correctement disposées et dimensionnées pour être converties avec succès en une structure NewStuff.

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