Maison >développement back-end >C++ >Comment convertir des structures C# en tableaux d'octets pour la communication Socket ?

Comment convertir des structures C# en tableaux d'octets pour la communication Socket ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-24 14:41:12957parcourir

How to Convert C# Structures to Byte Arrays for Socket Communication?

La conversion mutuelle de la structure et du tableau d'octets dans la structure du C #

Lorsque vous utilisez une communication de machine à sous en C #, la structure doit être convertie en tableau d'octets. Cela peut être mis en œuvre par le mécanisme de maréchalage.

Définition de la structure

Considérez la structure suivante:

<code class="language-csharp">public struct CIFSPacket
{
    // 字段定义...
    public string Buffer;
}</code>
Marshalisation (sérialisée)

La classe de maréchal

fournit un traitement de joint de données entre le code d'hébergement et le code non hôte. Convertir la structure en tableau d'octets:

<code class="language-csharp">using System.Runtime.InteropServices;

public static byte[] GetBytes(CIFSPacket str)
{
    int size = Marshal.SizeOf(str);
    byte[] arr = new byte[size];

    IntPtr ptr = IntPtr.Zero;
    try
    {
        ptr = Marshal.AllocHGlobal(size);
        Marshal.StructureToPtr(str, ptr, true);
        Marshal.Copy(ptr, arr, 0, size);
    }
    finally
    {
        Marshal.FreeHGlobal(ptr);
    }
    return arr;
}</code>
Unmarshalling

Le tableau d'octets est converti à la structure:

Marshaling
<code class="language-csharp">public static CIFSPacket FromBytes(byte[] arr)
{
    CIFSPacket str = new CIFSPacket();

    int size = Marshal.SizeOf(str);
    IntPtr ptr = IntPtr.Zero;
    try
    {
        ptr = Marshal.AllocHGlobal(size);

        Marshal.Copy(arr, 0, ptr, size);

        str = (CIFSPacket)Marshal.PtrToStructure(ptr, str.GetType());
    }
    finally
    {
        Marshal.FreeHGlobal(ptr);
    }
    return str;
}</code>

Lors de l'étanchéité de la chaîne dans la structure de traitement, assurez-vous d'utiliser la représentation de la chaîne spécifiée d'attribut

. Pour

une telle chaîne de longueur fixe dans l'exemple de structure, veuillez utiliser: [MarshalAs] Buffer

L'un de 100 est remplacé par la longueur de chaîne maximale.
<code class="language-csharp">[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string Buffer;</code>

Résumé

En utilisant le maréchalage, la structure peut être facilement convertie en réseau d'octets pour la transmission des données. Cette technologie est généralement utilisée dans les applications réseau, telles que l'envoi et la réception de messages par des sockets.

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