0

我正在尝试为我的霍夫曼编码构建一个位打包器。

由于霍夫曼编码的性质,我有以下形式的字符串: 01001 是可变长度的。我想将它们打包成一个整数以节省空间。

这是我正在做的事情main

bitpack.pack(found->second, found->second.size());

在我的 bitpack 里面我正在做

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,我只想换档。这样我就可以继续打包成我的整数,一旦它

代码更新

4

3 回答 3

2

这里有一个问题:

 buffer << 1;

什么都不做。这就像写作x + 1y % 7; 它返回结果但不修改变量的值。我相信你正在寻找

buffer <<= 1;

或者

buffer = buffer << 1;

我不熟悉霍夫曼编码,但这是代码逻辑的一个明显问题。

buffer << 0;

甚至

buffer <<= 0;

将没有效果(它移动buffer了零位)。那条线应该做什么?

于 2013-03-24T20:50:22.127 回答
1

请尝试buffer=buffer<<1;移动它(或您实际想要多少位)。

无论您想做什么,请注意:buffer << 0;什么都不做(关于缓冲区值)

于 2013-03-24T20:43:35.350 回答
1

这条线,移位buffer但不存储移位器值

buffer << 1;

你应该使用这样的东西

buffer <<= 1;
于 2013-03-24T20:50:12.280 回答