0

文字列をバイナリコードに変換して戻す単純なプログラムに取り組んでいます。私はUbuntuで作業しており、Visual Studio 2015を使用してWindowsでプログラムをコンパイルしたかった.Linuxビルドは正常に実行されますが、Windowsではコンパイルされますが、次のようなものでクラッシュします

bitset<N> char

次の関数を呼び出すとき:

bool bin2string(std::string *psBinaryString, std::string *psCharakterString)
{
psCharakterString->clear();
char cTempArray[8];
char cTemp;

for(unsigned int i = 0; i < psBinaryString->length(); i += 8)
{
    for(unsigned int j = 0; j < 8; ++j)
    {
        cTempArray[j] = psBinaryString->c_str()[j + i];
    }
    std::bitset<8> Bitset(cTempArray);
    cTemp = static_cast<char>(Bitset.to_ulong());
    psCharakterString->push_back(cTemp);
}
return true;
}

さて、私の質問は、このコードの何が問題なのですか? Linux (gcc) と Windows (MinGW) では機能するのに、Visual Studio 2015 を使用する Windows では機能しないのはなぜですか?

これに対する私の現在の回避策は次のとおりです。

#ifdef _WIN32

bool bin2string(std::string *psBinaryString, std::string     *psCharakterString)
{
psCharakterString->clear();
char cTempArray[8];
char cTemp;

for(size_t i = 0; i < psBinaryString->length(); i += 8)
{
    for(size_t j = 0; j < 8; ++j)
    {
        cTempArray[j] = psBinaryString->c_str()[j + i];
    }
    cTemp = static_cast<char>(strtol(cTempArray, 0, 2));
    psCharakterString->push_back(cTemp);
}
return true;
}

#else

bool bin2string(std::string *psBinaryString, std::string *psCharakterString)
{
psCharakterString->clear();
char cTempArray[8];
char cTemp;

for(unsigned int i = 0; i < psBinaryString->length(); i += 8)
{
    for(unsigned int j = 0; j < 8; ++j)
    {
        cTempArray[j] = psBinaryString->c_str()[j + i];
    }
    std::bitset<8> Bitset(cTempArray);
    cTemp = static_cast<char>(Bitset.to_ulong());
    psCharakterString->push_back(cTemp);
}
return true;
}

#endif

これら 2 つのソリューションのどちらが優れていますか?

4

1 に答える 1

4

クラッシュは、std::bitset のコンストラクターが配列の長さ、または null で終了する文字列を想定しているという事実によって引き起こされます。

( http://en.cppreference.com/w/cpp/utility/bitset/bitsetのドキュメントを参照してください)

したがって、次を使用する必要があります。

std::bitset<8> Bitset(cTempArray, 8);
于 2017-01-03T16:51:29.410 に答える