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
292 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:

public struct CIFSPacket
{
    public uint protocolIdentifier;
    public byte command;
    // ... other fields
}
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:

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;
}
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!

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