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

Bagaimana untuk Menukar Struktur C# kepada Tatasusunan Byte untuk Komunikasi Soket?

Patricia Arquette
Patricia Arquetteasal
2025-01-24 14:41:12961semak imbas

How to Convert C# Structures to Byte Arrays for Socket Communication?

penukaran bersama struktur dan array byte dalam struktur dalam C#

Apabila menggunakan komunikasi slot di C#, struktur perlu ditukar kepada array byte. Ini boleh dilaksanakan melalui mekanisme marshaling.

definisi struktur

Pertimbangkan struktur berikut:

<code class="language-csharp">public struct CIFSPacket
{
    // 字段定义...
    public string Buffer;
}</code>
marshaling (bersiri)

Kelas marshal

menyediakan pemprosesan meterai data antara kod hosting dan kod bukan host. Tukar struktur ke array byte:

<code class="language-csharp">using System.Runtime.InteropServices;

public static 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>
unmarshalling

Arahan byte ditukar kembali ke struktur:

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

Apabila menyegel rentetan dalam struktur pemprosesan, pastikan anda menggunakan perwakilan rentetan yang ditentukan oleh atribut. Untuk

seperti rentetan panjang tetap dalam struktur contoh, sila gunakan:

[MarshalAs] Buffer satu daripada 100 digantikan dengan panjang rentetan maksimum.

<code class="language-csharp">[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string Buffer;</code>
Ringkasan

Dengan menggunakan marshaling, struktur boleh ditukar dengan mudah menjadi array byte untuk penghantaran data. Teknologi ini biasanya digunakan dalam aplikasi rangkaian, seperti menghantar dan menerima mesej oleh soket.

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

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