Maison >développement back-end >C++ >Comment convertir une structure C # (CIFSPACKET) en un tableau d'octets pour la transmission du réseau?

Comment convertir une structure C # (CIFSPACKET) en un tableau d'octets pour la transmission du réseau?

Barbara Streisand
Barbara Streisandoriginal
2025-01-24 14:47:10934parcourir

How to Convert a C# Structure (CIFSPacket) to a Byte Array for Network Transmission?

Conversion de la structure en tableau d'octets en C#

La transmission de données réseau nécessite la conversion de la structure en un tableau d'octets. La réponse suivante explique comment convertir une structure spécifique nommée CIFSPacket en un tableau d'octets en C# :

Question :

Comment convertir une structure CIFSPacket en un tableau d'octets pour la transmission réseau sur un socket ?

Réponse :

L'utilisation du Marshaling est un moyen efficace d'effectuer cette conversion.

Mise en œuvre :

  1. Inclure les fichiers d'en-tête : Ajoutez using System.Runtime.InteropServices; au début du programme.

  2. Fonction getBytes : Définir une fonction pour convertir une structure CIFSPacket en un tableau d'octets :

    <code class="language-csharp"> 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>
  3. Fonction fromBytes : Définit une fonction pour reconvertir un tableau d'octets en une structure CIFSPacket :

    <code class="language-csharp"> 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>

Autres notes :

  • Pour les champs de chaîne, spécifiez [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)] pour représenter une chaîne d'une taille maximale de 100.

Exemple d'utilisation :

Fonction d'envoi :

<code class="language-csharp">byte[] byteArr = getBytes(packet);
MyPing.SendTo(byteArr);</code>

Fonction de réception :

<code class="language-csharp">byte[] receivedArr = null; // 接收数据包
CIFSPacket receivedPacket = fromBytes(receivedArr);</code>

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