-1

我需要保存一些数据,唯一可行的选择是std::string; 所以我得到一个作为void*. 现在我需要以一种可以将其转换为 astd::string并能够从该确切字符串中读取void*a的方式来保存它。bool[]可悲的是,我迷失在转换中。

f(const void* data, int length){

   bool** boolPointer = (bool**)(data);
   bool boolArray[length];

   for (int i=0; i<=length; i++){
       boolArray[i] = p[sizeof(bool)*i];
   }

   std::string s = (std::string&)boolArray;
}

我很确定最后一行不是可行的转换,但那是我的尝试。

4

3 回答 3

3

这对你有用吗?

char f(bool b)
{
    return b ? '1' : '0';
}

int main()
{
    // let's just consider whatever is there in this uninitialized array
    bool buf[100];

    std::string s;

    // transform and copy (convert true to '1' and false to '0')
    std::transform(&buf[0], &buf[99], std::back_inserter(s), f);

    std::cout << s << std::endl;
}

如果您使用的是 C++11,则可以使用以下代码片段

int main()
{
    bool buf[100];

    std::string s;

    std::transform(&buf[0], &buf[99], std::back_inserter(s), [](bool const &b){ return b ? '1' : '0'; });
    std::cout << s << std::endl;
}
于 2013-01-24T13:09:47.813 回答
0

好吧,我想你可以打开你的 C++ 书......

std::string f(std::vector<unsigned char> const& v)
{
    std::string temp;

    for (auto c : v) {
        for (unsigned i = 0; i < 8; ++i) {
            temp += (c & (1 << i)) ? '1' : '0';
        }
    }

    return temp;
}

std::copy使用类似或其他一些神秘的东西可能更容易做到这一点back_inserter,但我想保持简单。另一种选择是使用std::bitset或您自己的封装,以摆脱丑陋的位操作。

如果你被魔鬼强迫通过 传递数据void*,只需将其转换为向量:

unsigned char* begin = static_cast<unsigned char*>(data);
vector<unsigned char> v (begin, begin + length);

另请注意,如果它是用于序列化目的,那么计算机和人类都很难读取该表示。如果它打算由计算机读取,请将其保存为二进制而不进行转换。如果它是供人类阅读的,请将其保存为十六进制字符(将每个字节分成两半)。

于 2013-01-24T13:06:56.163 回答
0

您可以重载输出运算符以将布尔值转换为您想要的任何内容:

ostream& operator<<(const ostream& os, const bool& value) {
    return os << (value ? "1" : "0");
}

然后将数组复制到 a stringstream

int main() {
    // ...
    ostringstream oss;
    copy(data, data+size, ostream_iterator<bool>(oss));

    oss.str(); // this is the string you're looking for
    // ...
}
于 2013-01-24T13:20:41.317 回答