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
Libérer: 2025-01-24 14:51:10
original
270 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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!

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