ハフマン符号化用のビットパッカーを作成しようとしています。
ハフマン符号化の性質上、可変長の01001の形式の文字列があります。スペースを節約するために、これらを整数にビットパックしたいと思います。
これが私がしていることですmain
:
bitpack.pack(found->second, found->second.size());
そして私のビットパックの中で私はやっています
void BitPacker::pack(std::string stream, int size)
{
std::cout << "BitPacker received:\t" << stream.c_str() << "\t" << size << std::endl;
for(int i = 0; i < size; i++) {
//if buffer is not full keep shifting
std::cout << "Buffer index: " << index << std::endl;
std::bitset<8> binary(buffer);
std::cout << "Buffer: " << binary << std::endl;
if(index < 8) {
if(stream.at(i) == '1') {
buffer += 1;
//buffer << 1;
buffer <<= 1;
index++;
}
else {
//buffer << 0;
buffer <<= 1;
index++;
}
}
//write buffer
else {
std::cout << "Writting:\t"<< buffer << std::endl;
outfile->put(buffer);
index = 0;
buffer = 0;
}
}
}
しかし、私は何か間違ったことをしているようです。
私がやりたいのは、ストリームを反復処理し、それが1の場合は、ビットを追加してからシフトすることです。0の場合は、シフトしたいだけです。そうすれば、整数にビットを詰め続けることができます。
コードが更新されました