3

74MB ファイルのすべてのビットを表す大規模なビットセットがあります。圧縮アルゴリズムを使用して、このビットセットの圧縮された文字列表現を作成しています。次に、その文字列を別の動的ビットセットに格納して、後で解凍できるようにする必要があります。私の問題は、文字列からビットセットをどのように埋めようとしても、常に逆の順序で埋められることです。

簡単にするために、圧縮された文字列が

1110001101010111011101

出力動的ビットセットを埋める最初の試みは次のとおりです。

string compressed = 1110001101010111011101;
output = boost::dynamic_bitset<unsigned char> (compressed);

これを行うと、ビットセットは文字列の逆になります。

   1011101110101011000111

それで、私はこれを試しました:

output = boost::dynamic_bitset<unsigned char> (compressed.begin(), compressed.end());

そして、まったく同じ出力が得られます。次に、逆イテレータを使用してみましたが、これがどのように可能かはわかりませんが、まったく同じ方法でビットセットを埋めます:

output = boost::dynamic_bitset<unsigned char> (compressed.rbegin(), compressed.rend());

ビットセットを適切な順序で満たす唯一の方法は、次のようにすることです。

for(uint i = 0; i < compressed.size(); i++)
{
    if(compressed[i] == '0') 
       output.push_back(false);
    else output.push_back(true);
}

これにより、出力ビットセットが適切な順序で埋められますが、他の方法を使用するよりも大幅に遅くなります (使用している文字列では 30 秒遅くなります)。また、std::reverse を使用して文字列を元に戻し、ビットセットを埋めることもできますが、これには多くの余分な時間がかかります。通常の順序で文字列の値を動的ビットセットに効率的に入力する方法はありますか? 逆に埋められている理由は理解していますが、ビットセットを使用して整数を表すのではなく、ファイルからのデータを保存するために使用しているため、順番に並べる必要があります。ただし、逆イテレータを使用しても同じ出力が生成される理由がわかりません。

編集出力とコードの関連部分のスクリーンショットを撮りました。圧縮された出力には、ビットセットの圧縮バージョンの最初の 6000 文字が文字列として格納されて表示されます。この文字列自体は問題ありません。赤の下線は、この文字列を bitset boost::dynamic_bitset 出力に格納するために使用している行です。次に、出力ビットセットの最初の 6000 文字を出力すると、それらは完全に異なります。「出力」ビットセットは参照パラメーターとしてこの関数に渡されますが、最初は空であることに注意してください。 出力

4

1 に答える 1