Memcpy和结构

时间:2014-04-04 19:05:23

标签: c++ arrays vector

我正在努力将以下结构复制到字节数组以通过命名管道发送。我发现自从我给出静态定义的字节数组切换到向量,因为我的主机长度会有不同的长度。

以下是我的结构概要:

        USHORT version;                                 // Header Version
    USHORT type;                                    // IPVersion
    USHORT count;                                   // Number of IP addresses of remote system
    USHORT length;                                  // Header Length (1)
    BYTE SysConfigLocIP[4];
    BYTE SysConfigRemoteIP[4];
    USHORT lengthHost;
    std::vector<BYTE>HostName;

之后,在填充结构后,我将其复制到如下字节:

    BYTE Response[sizeof(aMsg)]
    memcpy(response, &aMsg, sizeof(aMsg))

当我在调试期间检查容器时,我发现我的数组是vector正在为主机保存正确的信息。但是,在复制到响应字节数组之后,我发现已复制的数据完全不同。这是一个有效的操作,如果是这样,我能做什么才能正确地从我的矢量BYTE数组中复制数据。如果没有,我可以使用什么其他策略动态调整结构大小以发送主机名?感谢您花时间阅读我的问题,感谢您的反馈。

3 个答案:

答案 0 :(得分:2)

  

我正在努力将以下结构复制到要发送的字节数组中   在命名管道上。

命名管道(或其他形式的进程间或处理器间通信)无法理解您的struct,也不理解vector。他们只是按照byte-in-byte-out的概念运作。程序员应该为这些字节赋予意义。

根据建议,请阅读序列化。尝试从http://en.wikipedia.org/wiki/Serialization开始。如果允许,您可以使用Boost解决方案http://www.boost.org/doc/libs/1_55_0/libs/serialization/doc/index.html,但我仍然鼓励您首先了解基础知识。

作为练习,首先尝试将vector<int>从发件人转移到接收者。接收器不得隐含地知道向量中的元素数量。实现这一目标后,从int迁移到struct将是微不足道的。

答案 1 :(得分:1)

memcpy仅适用于POD(普通旧数据)类型。矢量不是POD。相反,编写代码将缓冲区中的每个字节准确放置在需要的位置。不要依赖&#34;魔法&#34;。

答案 2 :(得分:0)

在C ++中99%的时间没有理由使用memcpy。它打破了课程。了解复制构造函数和std :: copy并改为使用它们。