【问题标题】:C++: using < bitset > to convert 01 string with unknown length into binaryC++:使用<bitset>将长度未知的01字符串转换为二进制
【发布时间】:2018-05-09 16:37:03
【问题描述】:

我正在使用霍夫曼压缩文件,但惊讶地发现压缩文件的大小比原来的还要大!检查我的代码后,我猜可能是因为使用了 bitset。这是我的代码:

void Huffman::compression(string filename,string comfile)
{
    ofstream write(comfile, ios::binary);
    ifstream ts;
    ts.open(filename);
    string str,bitstr;
    while (getline(ts, str))
    {
        bitstr = to_bitstr(str);
        //to_bitstr() function convert string into 01 string
        stringstream ss(bitstr);
        while (ss.good())
        {
            bitset<8> bits;
            ss >> bits;
            write << bits;
        }
    }
}

我分别使用bitset&lt;16&gt; 和bitset&lt;32&gt; 测试了我的程序,当然,文件越来越大。我大概知道原因:当01位无法填充bitset的大小时,会自动填充,这可能会花费额外的空间。
很长一段时间以来,我一直在寻找合适的解决方案...
以下是我的问题:如何使用 将未知长度的01 字符串转换为二进制?还是不可能做到这一点?还有其他更好的解决方案吗?
如果您能告诉我答案,我将不胜感激!

【问题讨论】:

  • 您可以使用std::bitset&lt;8&gt; 并将字符串分成8 位数字的部分。结果将适合 std::vector&lt;uint8_t&gt; 的单个字节。
  • std::vector&lt;bool&gt; 怎么样? std::vector&lt;&gt; 专门用于 bool 将值存储为位。
  • 非常感谢!我将文本作为字符串读取并将其转换为 01 字符串,然后将其转换为位集。但我改用 fwrite ,它解决了问题。!你的回答给了我灵感!
  • std::vector&lt;bool&gt; 很酷...

标签: c++


【解决方案1】:

简单的解决方案

如果性能不是问题,std::vector&lt;bool&gt; 非常适合。它也不支持某些库概念,但您似乎并没有使用它们。它可能需要重载operator&gt;&gt; 和operator&lt;&lt;。

更难的解决方案

滚动你自己的。这将需要一些开发时间,但如果您没有过度概括,它应该很快。只需在部署前对其进行测试。

采取依赖

Boost 具有动态位集。我相信他们有自己的许可证,因此可能需要一些时间来确定它是否适合您的项目,但除此之外它已经过很好的测试。我自己用过,效果很好。

【讨论】:

  • 我不知道如何将std::vector&lt;bool&gt; 写入二进制文件...我尝试了几种方法,但都无法正常工作。有没有办法做到这一点?
猜你喜欢
  • 2020-01-04
  • 2016-06-02
  • 2014-12-15
  • 1970-01-01
  • 2014-06-14
  • 2017-02-23
  • 2014-08-03
  • 1970-01-01
相关资源
最近更新 更多