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 :
using System.Runtime.InteropServices;
à votre code.Marshal.SizeOf(packet)
.IntPtr ptr = Marshal.AllocHGlobal(size);
.Marshal.StructureToPtr(packet, ptr, true);
.byte[] arr = new byte[size]; Marshal.Copy(ptr, arr, 0, size);
.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!