将字节缓冲区内容复制到结构中

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,也许你会幸运(再次)。

【讨论】:

以上是关于将字节缓冲区内容复制到结构中的主要内容,如果未能解决你的问题,请参考以下文章

无法将固定大小的字节数组从结构复制到 C# 结构中的另一个数组

c_cpp 将int复制到字节缓冲区

在结构或类中使用智能指针

从字节缓冲区中提取值

ByteBuffer 和字节数组

将具有动态字符串的结构复制到缓冲区 c