【发布时间】:2017-05-18 13:29:16
【问题描述】:
我正在开发一个通过UDP-Messages 与µController 通信的库。为此,我使用了一个自定义协议,它基本上是一个由 2 个元素组成的结构:标头(一些元数据 + 校验和)和有效负载。
通信是通过System.Net.Sockets.UDPClient 类完成的。要转换我的数据,我使用以下函数:
private List<byte> GetBytes(object str)
{
int size = Marshal.SizeOf(str);
byte[] arr = new byte[size];
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(str, ptr, true);
Marshal.Copy(ptr, arr, 0, size);
Marshal.FreeHGlobal(ptr);
return arr.ToList();
}
如果我想发送一些不是恒定大小的有效负载,例如,如果我只想将一些可变长度的数据写入 µController,我现在遇到了问题。我目前使用的一种解决方法是将我的有效负载封装在一个恒定(最大)大小的结构中,但这对我来说似乎不是很有效。
那么,有没有什么方法可以用 C# 将非恒定大小的结构转换为字节数组?例如这个结构:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
internal struct PERIPHERY__PROTOCOL
{
public PERIPHERY_HEADER strHeader;
public byte[] Data;
}
【问题讨论】:
-
@KillerIsDead 我认为这并不能解决这里问题的关键部分
-
请注意,在您的代码中,您正在分配一些非托管内存,写入它,然后释放非托管内存 - 这...实际上对任何事情都不是很有用
标签: c# arrays struct marshalling data-conversion