将结构添加到字节向量,然后添加另一个[关闭]
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)。否则,结构成员之间可能会有垃圾填充字节。
一种真正可移植的方法是每次按值插入每个成员,并在short
s 上使用按位运算来强制字节顺序,而不是转换指针或执行字节副本。
【讨论】:
当然!这很有意义。谢谢。 @Grasshopper 顺便说一句,对于这种特殊情况,您实际上不必使用reinterpret_cast
,但它确实非常清楚地表明了您的意图,所以,不要拿我的sn-p 作为反对它的案例。以上是关于将结构添加到字节向量,然后添加另一个[关闭]的主要内容,如果未能解决你的问题,请参考以下文章