c++ - 字符串转为二进制

标签 c++ qt

我使用我们编写的霍夫曼编码来压缩文件。 该函数采用 String ,其输出为 String

问题是我想将它保存为二进制文件以获得比原始大小更小的大小,但是当我将它作为字符串取回(0和1)时,它的大小比主文件大。如何将该字符串(0 和 1)转换为二进制,以便每个字符都保存在 1 位中?我正在使用 Qt 来实现这一点:

string Huffman_encoding(string text)
{
    buildHuffmanTree(text);

    string encoded = "";
    unordered_map<char, string> StringEncoded;
    encoding(main_root, "", StringEncoded);

    for (char ch : text) {
        encoded += StringEncoded[ch];
    }
    return encoded;
}

最佳答案

规范的解决方案使用接受位串并发出打包字节的“位打包器”。首先,将 encoded 替换为以下实例:

class BitPacker {
  QByteArray res;
  quint8 bitsLeft = 8;
  quint8 buf = 0;

  public:
  void operator+=(const std::string& s) {
    for (auto c : s) {
      buf = buf << 1 | c - '0';
      if (--bitsLeft == 0) {
        res.append(buf);
        buf = 0;
        bitsLeft = 8;
      }
    }
  }

  QByteArray finish() {
    if (bitsLeft < 8) {
      res.append(buf << bitsLeft);
      buf = 0;
      bitsLeft = 8;
    }
    return res;
  }
}

operator+= 将向 buf 添加额外的位,并将完整字节刷新到 res。在该过程结束时,您可能会留下 3 位。 finish 使用一个简单的算法:它用零填充缓冲区以生成最终字节,并将完全编码的缓冲区返回给您。

更复杂的解决方案可能是引入源字符集中不存在的显式“流结束”标记。

关于c++ - 字符串转为二进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70393068/

相关文章:

c++ - 当我使用 -isystem 标志而不是 INCLUDEPATH 时,QtCreator 的代码检查器中断

c++ - C++ 中的舍入错误

C++验证输入不起作用

c++ - 以十六进制修改 exe 后推送指令中的地址发生变化

c++ - 继承函数的重载解决方案

c++ - 仅在 Qt 5.5 中与 RegisterDeviceNotification 链接错误

c++ - 为什么从不可 move 类派生的类本身是可 move 构造的?

html - QDomDocument 按类获取元素

c++ - 如何在 QString 中使用语言(如阿拉伯语或中文)?

c++ - 如何使用 QtConcurrent::run 调用以指针为参数的非类成员函数?