Rumah > pembangunan bahagian belakang > C++ > Bagaimana dengan Cekap Menukar Struktur C# kepada Tatasusunan Byte untuk Komunikasi Rangkaian?

Bagaimana dengan Cekap Menukar Struktur C# kepada Tatasusunan Byte untuk Komunikasi Rangkaian?

Barbara Streisand
Lepaskan: 2025-01-24 14:51:10
asal
217 orang telah melayarinya

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

Memperkemaskan Struktur C# kepada Penukaran Tatasusunan Bait untuk Penghantaran Rangkaian

Menghantar data berstruktur dengan cekap merentas rangkaian selalunya memerlukan penukaran struktur C# kepada tatasusunan bait. Walaupun struktur mengumpulkan data berkaitan, ia tidak serasi secara langsung dengan penghantaran rangkaian binari.

Mari kita ilustrasikan dengan contoh:

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

Untuk menukar CIFSPacket tika (packet) kepada tatasusunan bait, ikut langkah berikut:

  1. Import Marshaling: Tambahkan using System.Runtime.InteropServices; pada kod anda.
  2. Penentuan Saiz: Kira saiz struktur dalam bait menggunakan Marshal.SizeOf(packet).
  3. Peruntukan Memori: Peruntukkan memori yang tidak terurus menggunakan IntPtr ptr = Marshal.AllocHGlobal(size);.
  4. Struktur Marshaling: Salin struktur ke memori yang diperuntukkan: Marshal.StructureToPtr(packet, ptr, true);.
  5. Penciptaan Tatasusunan Byte: Cipta tatasusunan bait dan salin data: byte[] arr = new byte[size]; Marshal.Copy(ptr, arr, 0, size);.
  6. Keluaran Memori: Kosongkan memori yang tidak terurus: Marshal.FreeHGlobal(ptr);.

Proses ini menukar struktur kepada tatasusunan bait sedia rangkaian.

Proses terbalik (tatasusunan bait ke struktur) adalah sama mudah:

<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>
Salin selepas log masuk

Untuk medan rentetan dalam struktur anda, gunakan atribut [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)], menggantikan 100 dengan panjang rentetan maksimum.

Kaedah ini memastikan penukaran tatasusunan struktur-ke-bait yang boleh dipercayai untuk komunikasi rangkaian yang mantap.

Atas ialah kandungan terperinci Bagaimana dengan Cekap Menukar Struktur C# kepada Tatasusunan Byte untuk Komunikasi Rangkaian?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan