-1

一部のデータを保存する必要がありますが、実行可能な唯一のオプションはstd::string; です。そのため、ブール配列が として渡されますvoid*。次に、それを に変換して、その正確な文字列からaから a を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;
}

最後の行は実行可能な変換ではないと確信していますが、それは私の試みでした。

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

出力演算子をオーバーロードして、ブール値を必要なものに変換できます。

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
    // ...
}
于 2013-01-24T13:20:41.317 に答える
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);

また、シリアル化が目的の場合、その表現はコンピューターと人間の両方でほとんど読み取れないことに注意してください。コンピューターで読み取ることを意図している場合は、変換せずにバイナリとして保存します。人間が読むことを意図している場合は、16 進文字として保存します (各バイトを半分に分割します)。

于 2013-01-24T13:06:56.163 に答える