C++ 我可以为C++;包含向量的结构

C++ 我可以为C++;包含向量的结构,c++,struct,stdvector,C++,Struct,Stdvector,我正在尝试构建和编写一个二进制请求,并且有一个“这可能吗”类型的问题。对我来说,重要的一点可能是,请求的接收者不知道我在下面介绍的数据结构,它只需要一个字节序列,但使用结构似乎是准备请求片段的一种简便方法,然后轻松地编写它们 写页眉和页脚很好,因为它们的大小是固定的,但是由于向量的原因,我遇到了结构“Details”的问题。现在我正在写一个文件,这样我就可以检查请求是否符合规范,但目的是最终使用boost asio串行端口写入PLC 我可以使用这样的语法来编写结构,但当它到达向量时,它会写入指针

我正在尝试构建和编写一个二进制请求,并且有一个“这可能吗”类型的问题。对我来说,重要的一点可能是,请求的接收者不知道我在下面介绍的数据结构,它只需要一个字节序列,但使用结构似乎是准备请求片段的一种简便方法,然后轻松地编写它们

写页眉和页脚很好,因为它们的大小是固定的,但是由于向量的原因,我遇到了结构“Details”的问题。现在我正在写一个文件,这样我就可以检查请求是否符合规范,但目的是最终使用boost asio串行端口写入PLC

我可以使用这样的语法来编写结构,但当它到达向量时,它会写入指针地址而不是值

myFile.write((char*) &myDataRequest, drSize);
我可以使用这个sytax自己编写一个向量,但是我必须在0处包含索引器来编写值

myFile.write((char*) &myVector[0], vectorSize);
有没有一种优雅的方法可以一次性二进制地编写包含向量(或其他合适集合)的结构?比如说,如果我以不同的方式声明了向量,或者我愿意对结构中的内容进行多次写入。如果我用数组替换向量,我可以一次性发送结构(不需要包含任何索引器),但在运行时之前我不知道所需的大小,因此我认为它不合适

我的结构

    struct Header
    {   ...     };

    struct Details
    {
           std::vector<DataRequest> DRList;
    };

    struct DataRequest
    {
           short numAddresses;          // Number of operands to be read   Bytes 0-1
           unsigned char operandType;   //                                  Byte 2
           unsigned char Reserved1;     //Should be 0xFF                    Byte 3
           std::vector<short> addressList;  // either, starting address (for sequence), or a list of addresses (for non-sequential) 
    };

    struct Footer
    {   ...     };
struct头文件
{   ...     };
结构细节
{
std::矢量DRList;
};
结构数据请求
{
short numAddresses;//要读取的操作数字节数0-1
无符号字符操作数类型;//字节2
unsigned char Reserved1;//应为0xFF字节3
std::vector addressList;//起始地址(用于序列)或地址列表(用于非序列)
};
结构页脚
{   ...     };

这并不是一个好的策略,因为即使可以这样做,也会将内存内容直接复制到文件中。如果更改架构/处理器,您的客户端将获得不同的数据。如果您使用结构和文件名编写一个方法,该方法分别写入结构值并在向量上迭代写出其内容,那么您将完全控制客户端期望的二进制格式,并且不依赖于编译器的当前内存表示


如果您想方便编组/解编组,应该查看库。他们确实提供了二进制存档(除了文本和xml之外),但它有自己的格式(例如,它有一个版本号,序列化库用于转储数据),所以这可能不是您的客户想要的。

这不是一个很好的策略,因为即使您可以这样做,您也将内存内容直接复制到文件中。如果更改架构/处理器,您的客户端将获得不同的数据。如果您使用结构和文件名编写一个方法,该方法分别写入结构值并在向量上迭代写出其内容,那么您将完全控制客户端期望的二进制格式,并且不依赖于编译器的当前内存表示


如果您想方便编组/解编组,应该查看库。他们确实提供了二进制存档(除了文本和xml),但它有自己的格式(例如,它有一个版本号,序列化库用于转储数据)因此,这可能不是您的客户端想要的。

这是不可能的,因为
std::vector
对象实际上不包含数组,而是指向内存块的指针。但是,我很想声明,能够编写这样的原始结构是不可取的:

  • 我认为,如果将结构视为内存块,最终可能会发送填充字节,我认为这是不可取的

  • 根据写入内容的不同,您可能会发现写入操作都是缓冲的,因此多个写入调用实际上并不会降低效率

  • 您可能希望对发送过来的字段执行某些操作。特别是,使用您发送的数值。这需要强制执行传输双方都同意的字节顺序。为了便于移植,您应该精确地转换字节顺序,以确保您的软件是可移植的(如果需要)


  • 长话短说:我怀疑逐个写出每个字段不仅效率低,而且更准确。

    这是不可能的,因为
    std::vector
    对象实际上并不包含数组,而是一个指向内存块的指针。但是,我很想声明,能够编写这样的原始结构是不可取的:

  • 我认为,如果将结构视为内存块,最终可能会发送填充字节,我认为这是不可取的

  • 根据写入内容的不同,您可能会发现写入操作都是缓冲的,因此多个写入调用实际上并不会降低效率

  • 您可能希望对发送过来的字段执行某些操作。特别是,使用您发送的数值。这需要强制执行传输双方都同意的字节顺序。为了便于移植,您应该精确地转换字节顺序,以确保您的软件是可移植的(如果需要)


  • 长话短说:我怀疑逐个写出每个字段不仅效率更低,而且更准确。

    另一端的格式到底是什么?你必须写作 那,期间。你不能只写任何随机字节。概率 像您这样编写一个
    std::vector
    就可以了 尽可能接近0。但是写一个
    structbyte[0] = (value >> 24) & 0xFF;
    byte[1] = (value >> 16) & 0xFF;
    byte[2] = (value >>  8) & 0xFF;
    byte[3] = (value      ) & 0xFF;