将结构添加到字节向量,然后添加另一个[关闭]

Posted

技术标签:

【中文标题】将结构添加到字节向量,然后添加另一个[关闭]【英文标题】:Add structure to vector of bytes and then add another [closed] 【发布时间】:2014-03-04 21:48:59 【问题描述】:

我有各种结构(由整数类型和整数类型数组组成)和一个无符号字符数组,我想将它们添加到无符号字符向量中。

所以,给定以下伪代码:

struct

short x;
short sz;
unsigned char y;
unsigned char w;
unsigned char z[ 2 ];
 example_struct;

example_struct ex_s;
unsigned char array[ <some val-could be several thousand> ];

我看了这个问题:Convert a struct to vector of bytes 我写了以下内容:

std::vector< unsigned char > v( sizeof( example_struct ) + array_len );
unsigned char * ptr = reinterpret_cast< unsigned char * >( &ex_s );
std::vector< unsigned char > tmp_v( ptr, ptr + sizeof( example_struct ) );
v = tmp_v;
std::vector< unsigned char > tmp_v2( array, array + array_len );
v.insert( v.end(), tmp_v2.begin(), tmp_v2.end() );

有没有更简单(更易读)的方法?

用结构的内容创建 v 比分配临时变量更有效吗?

如果这样做了,那么 v 将不是最终长度的大小,很可能导致在添加数组时通过向量进行另一个内存分配。是否会优先创建一个空向量,然后是总长度的保留加上添加?

交换优先于分配吗?

插入是添加第二个向量的首选方式吗?

关于如何写这篇文章还有其他建议吗?

【问题讨论】:

这个问题对于 Stack Overflow 来说太宽泛了,这是针对有明确答案的编码的具体问题。这更适合Code Review 或Programmers。请阅读this meta post 了解更多信息。 【参考方案1】:

你不需要创建一个临时的vector,你可以使用insert(),例如:

vector<unsigned char> v;
unsigned char *ptr = (unsigned char *)&ex_s;
v.insert(v.end(), ptr, ptr + sizeof(example_struct));
v.insert(v.end(), array, array + array_len);

请注意,您也不需要(或者,在我的示例中,不需要)给向量一个初始大小。但是,您可能希望提前保留 容量(一种简单但有时为时过早的优化):

v.reserve(sizeof(example_struct) + array_len); // <- prior to inserts

另外,请注意结构成员填充可能会导致其在向量中的表示与您期望的不同;或至少在编译器之间不一致。您将需要使用 1 字节打包;编译器特定选项(例如#pragma pack for MSVC 或__attribute__((packed)) for GCC)。否则,结构成员之间可能会有垃圾填充字节。

一种真正可移植的方法是每次按值插入每个成员,并在shorts 上使用按位运算来强制字节顺序,而不是转换指针或执行字节副本。

【讨论】:

当然!这很有意义。谢谢。 @Grasshopper 顺便说一句,对于这种特殊情况,您实际上不必使用 reinterpret_cast,但它确实非常清楚地表明了您的意图,所以,不要拿我的sn-p 作为反对它的案例。

以上是关于将结构添加到字节向量,然后添加另一个[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何将唯一指针从一个向量移动到另一个唯一指针向量? [关闭]

如何根据来自另一个向量的信息将向量中的元素添加在一起

将字符串添加到向量的向量[关闭]

迭代器在添加到添加到列表向量的结构中时会停止指向某个值吗?

将向量初始化添加到结构构造函数

将 long 转换为字节数组并将其添加到另一个数组