我需要保存一些数据,唯一可行的选项是std::string
;所以我得到一个bool数组作为void*
传递。现在我需要保存它,我可以将其转换为std::string
,并且能够从该确切的字符串中读取void*
到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;
}
我很确定最后一行不是可行的转换,但这是我的尝试。
答案 0 :(得分: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;
}
答案 1 :(得分: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);
请注意,如果是出于序列化目的,那么计算机和人类都无法读取该表示。如果要由计算机读取,请将其保存为二进制文件而不进行转换。如果它是由人类阅读,请将其保存为十六进制字符(将每个字节分成两半)。
答案 2 :(得分:0)
您可以重载输出运算符以将布尔值转换为您想要的任何值:
ostream& operator<<(const ostream& os, const bool& value) {
return os << (value ? "1" : "0");
}
然后将数组复制到stringstream
:
int main() {
// ...
ostringstream oss;
copy(data, data+size, ostream_iterator<bool>(oss));
oss.str(); // this is the string you're looking for
// ...
}