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