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通信中发送和接收结构化数据的方法,从而在实际项目中得到应用。
阅读剩余
版权声明:
作者:nisedt
链接:https://www.grixy.cn/programming/2024/01/11/50.html
文章版权归作者所有,未经允许请勿转载。
THE END
