C# TCP通信中结构体与字节数组相互转换

在C# TCP通信中,发送和接收结构化数据是一项至关重要的任务。本文将介绍如何使用C#代码实现将结构体转换为字节数组,以及将字节数组转换为结构体的过程。这些步骤对于在C# TCP通信中发送结构化数据至关重要。

首先,我们需要定义一个结构体,用于存储要发送或接收的数据。在定义结构体时,需要使用System.Runtime.InteropServices命名空间,并添加[StructLayoutAttribute(LayoutKind.Sequential, CharSet=CharSet.Ansi, Pack=1)]属性。结构体中可以包含各种数据类型,如整数、字符串和数组。

注意:这里有一个坑,结构体在C#内存中以 [MarshalAs(UnmanagedType.Bool)]布局时占用内存为4byte而不是1bit。

[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct realTimeData
{
    /// <summary>
    /// 运行状态
    /// </summary>
    [MarshalAs(UnmanagedType.Bool)]
    public bool Run;
    /// <summary>
    /// X轴实时位置
    /// </summary>
    [MarshalAs(UnmanagedType.R4)]
    public float XAxisRealTimePosition;
    /// <summary>
    /// 模式选择
    /// </summary>
    [MarshalAs(UnmanagedType.I4)]
    public short ModeSelection;
}

接下来,我们需要编写代码将定义的结构体转换为字节数组。这涉及到计算结构体的大小,创建字节数组,分配内存空间,将结构体拷贝到内存空间,并最终将内存空间中的数据拷贝到字节数组中。

public  static  byte[] StructToBytes( object structObj)
{
    // 得到结构体的大小
    int size = Marshal.SizeOf(structObj);
    // 创建byte数组
    byte[] bytes =  new  byte[size];
    // 分配结构体大小的内存空间
    IntPtr structPtr = Marshal.AllocHGlobal(size);
    // 将结构体拷到分配好的内存空间
    Marshal.StructureToPtr(structObj, structPtr,  false);
    //从 内存空间拷到byte数组
    Marshal.Copy(structPtr, bytes, 0, size);
    // 释放内存空间
    Marshal.FreeHGlobal(structPtr);
    // 返回byte数组
    return bytes;
}

另一方面,当接收到字节数组时,我们需要将其转换回结构体。这需要计算结构体的大小,分配内存空间,将字节数组拷贝到内存空间,并将内存空间中的数据转换为目标结构体。

public  static  object BytesToStuct( byte[] bytes,Type type)
{
    // 得到结构体的大小
    int size = Marshal.SizeOf(type);
    // byte数组长度小于结构体的大小
    if (size > bytes.Length)
    {
        return  null;
    }
    // 分配结构体大小的内存空间
    IntPtr structPtr = Marshal.AllocHGlobal(size);
    // 将byte数组拷到分配好的内存空间
    Marshal.Copy(bytes,0,structPtr,size);
    // 将内存空间转换为目标结构体
    object obj = Marshal.PtrToStructure(structPtr, type);
    // 释放内存空间
    Marshal.FreeHGlobal(structPtr);
    // 返回结构体
    return obj;
}

通过以上步骤,我们可以实现在C# TCP通信中发送和接收结构化数据的功能,从而实现更灵活和高效的数据交换。这对于与其他程序进行通信或处理复杂数据类型非常有用。

在实际项目中,这些步骤可以帮助我们更好地处理结构化数据,提高通信效率,以及与其他系统进行无缝集成。希望本文能够帮助读者更好地理解在C# TCP通信中发送和接收结构化数据的方法,从而在实际项目中得到应用。


阅读剩余
THE END