将字节缓冲区内容复制到结构中
Posted
技术标签:
【中文标题】将字节缓冲区内容复制到结构中【英文标题】:copy byte buffer contents to a structure 【发布时间】:2014-04-29 12:11:24 【问题描述】:我正在尝试将缓冲区的内容复制到结构中。缓冲区包含从 UDP recvfrom 函数接收到的数据。 在 cpp 中,我使用 memcpy 函数完成了它。我怎么能在 C# 中做到这一点? 我尝试使用 Marshal 函数,但出现了一些错误。 我的代码是:
sending_socket.SendTo(buff2, sending_end_point);
sh = sending_socket1.ReceiveFrom(navdata, ref remote);
int size = Marshal.SizeOf(typeof(navdata));
IntPtr ptr = Marshal.AllocHGlobal(size);
try
Marshal.Copy(navdata, 0, ptr, size);
Marshal.PtrToStructure(ptr, typeof(navdata1));
finally
Marshal.FreeHGlobal(ptr);
结构的名称是 navdata1。 我已将缓冲区定义为: byte[] navdata = new byte[1024] 问候, 湿婆
【问题讨论】:
unsafe
代码是一个选项吗? “但是有一些错误。”什么错误,完全正确(即复制/粘贴错误消息)?你用的是什么方法; Marshal.PtrToStructure
?还是...?
代码是否正确?导航数据缓冲区未被识别...
【参考方案1】:
根据您提供的信息,我不能肯定地说,但您可能遇到了“映射问题”。也就是说,您的“导航数据”结构(您尚未给出定义)遵循 C#/dot-NET 的数据类型大小、对齐/位置等约定,这不是实际发送的“在线” ”。
在 C++ 中,您很幸运编译器的约定与实际数据格式匹配(在 C++ 中,每个编译器/平台对此都有自己的约定,并且可以通过编译器选项、#pragmas 等进行调整)
如果是这样,您可以“手动”从缓冲区中逐项提取数据。实际上,这是您通常应该做的 - 尽管您可以为此目的创建一些库,以使您的生活更轻松。
或者你可以使用 C++/CLI,也许你会幸运(再次)。
【讨论】:
以上是关于将字节缓冲区内容复制到结构中的主要内容,如果未能解决你的问题,请参考以下文章