【问题标题】:how can I memcpy bool vector to char array?如何将 bool 向量 memcpy 转换为 char 数组?
【发布时间】:2015-09-26 08:03:18
【问题描述】:

我有两个向量。
一个是

std::vector<unsigned char> one_v;

另一个是

std::vector<bool> outputValuesInBits;

我将值推送到 one_v 和 outputValuesInBits。
两个向量都有两个字节。
one_v[0] 和 [1] 填充了 2 个字节的数据。
outputValuesInBits[0] 到 [15] 填充了 2 个字节的数据。
现在,我想复制(memcpy)数据到 char 数组。

我可以成功地从 one_v 向量中复制数据,如下所示。

 unsigned char* output = new unsigned char[one_v.size()]();
 memcpy(&output, one_v.data(), 2);

但我无法从 outputValuesInBits 复制数据。
如果我这样做,

unsigned char* output = new unsigned char[outputValuesInBits.size()/8+1]();
memcpy(&output, outputValuesInBits.data(), 2);

它给了我一个错误

error: invalid use of void expression
     memcpy(&output, outputValuesInBits.data(), 2);

谁能告诉我如何将 bool 向量复制到 char 数组?

提前谢谢你!

【问题讨论】:

标签: c++ arrays vector


【解决方案1】:

std::vector&lt;bool&gt; 没有数据成员函数

【讨论】:

【解决方案2】:

恐怕你不能以便携的方式。 Cplusplus page on vector 说:该特化具有与非特化向量相同的成员函数,除了 data、emplace 和 emplace_back,它们不存在于该特化中。这意味着 data 未定义什么在您尝试使用它时解释错误。

如果不能选择可移植性,则没有解决方案,因为存储不一定是 bool 值的数组,但库实现可能优化存储,以便存储每个值一点点。(强调我的)。我对可能的理解是,您甚至无法确定 16 个布尔值是否存储在 2 个连续字节中:实现必须只为您提供一种使用它们的方法(几乎),就像它们存储在16 种不同的布尔值。

如果您忘记了可分割性,您将不得不为您当前的实现找到源代码,以了解字节数组的存储位置和方式......但这并不容易......

【讨论】:

  • 谢谢。然后,我可能必须将位向量复制到位集。 'for loop' 是否只是将数据复制到 bitset 的解决方案?
  • 或者您认为有更好的方法可以从 bool 向量复制到 char* 吗?
【解决方案3】:

至少在g++编译器中你可以使用vector::iterator的_M_p成员,它是指向数据的指针。

例子:

std::vector<bool> vBool(16, false);
vBool[0] = true;
vBool[2] = true;
vBool[13] = true;
std::vector<unsigned char> vChar(2);
unsigned short *ptrUS = reinterpret_cast<unsigned short *>( &(vChar[0]) );
*ptrUS = *reinterpret_cast<unsigned short *>(vBool.begin()._M_p);

std::cout << (unsigned int)vChar[0] << " " << (unsigned int)vChar[1] << "\n";

在输出“5 32”中给出,它对应于第 1 位和第 3 位 (5) 以及第 6 位 (32) 的数字。

【讨论】:

    猜你喜欢
    • 2015-08-29
    • 2017-03-05
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    相关资源
    最近更新 更多