【问题标题】:Convert a struct to vector of bytes将结构转换为字节向量
【发布时间】:2013-12-11 20:18:14
【问题描述】:

在我的 C++ 应用程序中,我有这个结构

typedef struct 
{
int a;
int b;
char *c
}MyStruct

我有这个实例:

MyStruct s;

我也有这个定义:

vector<byte> buffer;

我想将s 结构插入\转换为缓冲区向量。

在 C++ 中最好的方法是什么?

谢谢。

【问题讨论】:

  • vector&lt;byte&gt; buffer(sizeof(s)); memcpy(&amp;buffer[0] &amp;s, sizeof(s));
  • 您是否要进行序列化?你关心字节顺序吗?填充?对齐?
  • 你想用你的char* c做什么?你应该复制它的内容吗?顺便说一句,你的代码看起来不像 C++
  • 小心,如果您正在进行序列化,请记住 char* 指针在另一个进程中将不再有效。

标签: c++ vector struct


【解决方案1】:

最好的方法是使用range copy constructor 和低级强制转换来检索指向结构内存的指针:

auto ptr = reinterpret_cast<byte*>(&s);
auto buffer = vector<byte>(ptr, ptr + sizeof s);

反之,你可以将字节缓冲区转换为目标类型(但它必须是相同的类型,否则你违反strict aliasing):

auto p_obj = reinterpret_cast<obj_t*>(&buffer[0]);

但是,对于索引 ≠ 0(我猜 技术上 也适用于索引 = 0,但这似乎不太可能)注意不匹配的 memory alignment。因此,更安全的方法是首先将缓冲区复制到properly aligned storage,然后从那里访问指针。

【讨论】:

  • 不错的答案。我有一个不同的问题:我需要做“其他方式”:我有一个 vector 填充了值(它的大小是,比如 100),我希望比较前 8 个字节具有给定结构的向量,其定义如下: struct BlockInfoHeader { uint32_t magicHeader; uint32_t 线程; uint64_t 时间戳; // 自运行开始以来的微秒数 uint64_t offset; uint32_t len; uint32_t 块索引; uint32_t 写入索引; uint32_t 种子; };为了将向量的前 8 个字节与预先给出的一些值进行比较。
  • @GuyAvraham,如果您仍有疑问,请提出一个新问题。
猜你喜欢
  • 2011-02-11
  • 2019-09-09
  • 2012-11-26
  • 1970-01-01
  • 2020-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多