【问题标题】:How can I convert a vector<uint8_t> into an unsigned char*如何将 vector<uint8_t> 转换为 unsigned char*
【发布时间】:2013-09-01 04:55:27
【问题描述】:

我有一个const vector&lt;uint8_t&gt;&gt;,我需要将它传递给一个接受const unsigned char* 的函数。这两种类型的大小相同,等等,所以我猜测这里有一种强制类型的好方法。处理此类问题的惯用方法是什么?

我的第一直觉是使用reinterpret_cast,但在演员表之后数据不一样了。这是我的代码:

shared_ptr<const vector<uint8_t>> data = operation.getData();
const unsigned char* data2 = reinterpret_cast<const unsigned char*>(&data);
myFunction(data2, data->size());

我可能在这里混淆了一个值的指针,但也许我的整个方法是不正确的。

【问题讨论】:

  • 或者更确切地说:data-&gt;data()
  • vector::data() 返回指向向量中实际数据的指针。
  • @BenjaminLindley,为什么?为什么?我一定要疯了。 operator-&gt; 到底怎么没想到?

标签: c++ vector type-conversion reinterpret-cast


【解决方案1】:

只需使用vector&lt;unsigned char&gt; 开头即可。在所有平台上,unsigned char 至少有 8 位。在具有 8 位无符号整数类型的平台上,uint8_t 将是 unsigned char 的同义词;在没有 8 位无符号整数类型的平台上,uint8_t 将不存在,但unsigned char 将存在。

【讨论】:

  • 您能否为“uint8_t 将成为unsigned char 的同义词”提供参考?难道它也不能是char 甚至是扩展的无符号整数类型的 typedef 吗?
  • @DyP - 你说得对,uint8_t 可能是 char 的同义词,编译器可以生成 char unsigned。除非您的代码需要 精确 8 位类型,否则不要使用uint8_t。这是一个相当罕见的要求。
【解决方案2】:

reinterpret_cast 几乎从来都不是正确的解决方案,除非您确切地知道自己在做什么,即使那样通常也不知道。

在您的情况下,您只需要一个指向向量内连续数据存储的指针(但不是向量本身,正如您所注意到的!它还存储其他数据,例如大小和容量)。很简单,就是数据第一个元素的指针:

&vector[0]

所以您的代码如下所示:

myFunction(&(*data)[0], data->size());

【讨论】:

  • 感谢您的清晰解释。关于 reinterpret_cast 的注释也令人难忘;在我弄清楚我一直在使用的其他工具之前,我会远离我 :)
  • 也可以使用std::vector::front(),有时更具可读性。 en.cppreference.com/w/cpp/container/vector/front
猜你喜欢
  • 2021-07-11
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
  • 1970-01-01
相关资源
最近更新 更多