Maison >développement back-end >C++ >Comment convertir efficacement les structures C # en tableaux d'octets pour la communication réseau?

Comment convertir efficacement les structures C # en tableaux d'octets pour la communication réseau?

Barbara Streisand
Barbara Streisandoriginal
2025-01-24 14:51:10271parcourir

How to Efficiently Convert C# Structures to Byte Arrays for Network Communication?

Rationalisation de la conversion de la structure C# en tableau d'octets pour la transmission réseau

La transmission efficace de données structurées sur des réseaux nécessite souvent de convertir des structures C# en tableaux d'octets. Bien que les structures regroupent les données associées, elles ne sont pas directement compatibles avec la transmission réseau binaire.

Illustrons avec un exemple :

<code class="language-csharp">public struct CIFSPacket
{
    public uint protocolIdentifier;
    public byte command;
    // ... other fields
}</code>

Pour transformer une instance CIFSPacket (packet) en tableau d'octets, suivez ces étapes :

  1. Import Marshaling : Ajoutez using System.Runtime.InteropServices; à votre code.
  2. Détermination de la taille : Calculez la taille de la structure en octets à l'aide de Marshal.SizeOf(packet).
  3. Allocation de mémoire : Allouez de la mémoire non gérée à l'aide de IntPtr ptr = Marshal.AllocHGlobal(size);.
  4. Marshaling de la structure : Copiez la structure dans la mémoire allouée : Marshal.StructureToPtr(packet, ptr, true);.
  5. Création d'un tableau d'octets : Créez un tableau d'octets et copiez les données : byte[] arr = new byte[size]; Marshal.Copy(ptr, arr, 0, size);.
  6. Libération de mémoire : Libérez la mémoire non gérée : Marshal.FreeHGlobal(ptr);.

Ce processus convertit la structure en un tableau d'octets prêt pour le réseau.

Le processus inverse (du tableau d'octets à la structure) est tout aussi simple :

<code class="language-csharp">public CIFSPacket FromBytes(byte[] arr)
{
    CIFSPacket str = new CIFSPacket();
    int size = Marshal.SizeOf(str);
    IntPtr ptr = Marshal.AllocHGlobal(size);
    Marshal.Copy(arr, 0, ptr, size);
    str = (CIFSPacket)Marshal.PtrToStructure(ptr, str.GetType());
    Marshal.FreeHGlobal(ptr);
    return str;
}</code>

Pour les champs de chaîne au sein de vos structures, utilisez l'attribut [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)], en remplaçant 100 par la longueur maximale de la chaîne.

Cette méthode garantit une conversion fiable de la structure en tableau d'octets pour une communication réseau robuste.

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