有没有办法将字符串转换为二进制数据以减小大小?

时间:2014-10-13 20:43:50

标签: c++ c++11 binary compression binaryfiles

我实施了霍夫曼编码(这是一项研究任务)。我得到一些文本字符串作为输入,并且我产生一些结果字符串,如:" 011010 00101 0110 0101 0110 0101 0111 0000 0010 0000 0110 0010 0110 1111 0110 1111 0111 0000 0010 0000 0110 0010 0110 0101 0110" 。

string some_text = read_text_file_to_string(text_file);

string coded_string = encode_string(some_text); // coded_string == "011010 00101 0110 0101..."

有没有办法将 coded_string 转换为二进制格式并将其写入文件?我的目标是减少输入数据的大小。但是,如果我将 coded_string 写入文件,我会得到更大的文件。

3 个答案:

答案 0 :(得分:0)

如果模式总是4个字符且后面有空格,则可以将8个数字转换为字节 - >二进制值或8位数(http://www.wikihow.com/Convert-from-Binary-to-Decimal),您可能还需要一个标志,告诉最后4位数字是实际4或8表示。但我认为......

答案 1 :(得分:0)

根据你的评论,空格不重要,我会假设除了0或1以外的任何东西都可以忽略。在这种情况下,您可以使用此功能将其写入文件流。请注意,最后一个八位字节将用零填充右边,因此如果输入的位数不能被8整除,则需要以某种方式解释这一点,可能是通过写出最后一个八位字节中的位数其他地方(也许是在数据之后)。

void write_bits(std::ostream & output, std::string const & input)
{
    unsigned char c;
    int bits = 0;

    for (auto i = output.begin(); i != output.end(); ++i) {
        if (*i == '0' || *i == '1') {
            c = (c << 2);
            if (*i == '1') {
                ++c;
            }

            if (++bits == 8) {
                output << c;
                c = 0;
                bits = 0;
            }
        }
    }

    if (bits > 0) {
        while (bits < 8) {
            c <<= 2;
            ++bits;
        }
        output << c;
    }
}

对于output参数,您可以传递std::ofstream以将输出写入文件,或者您可以使用std::ostringstream将数据写入可以使用的内存结构中转换为std::string

答案 2 :(得分:0)

由于您正在处理文本输入,即使使用文件,也可能有足够的内存来保存整个文件和ram中的编码数据。您可以选择将文本字符串直接编码为二进制缓冲区,然后创建一个函数将霍夫曼代码从二进制缓冲区转换为文本显示字符串,如原始问题所示。

为二进制缓冲区分配空间时,假设最坏的情况。例如,如果最长的代码是12位,那么最大位数将是12 x(n + 1)四舍五入到某个方便的边界,其中n是文本文件中的字节数,并且使用+1为了数据代码的结束。

创建一个可以将文本文件编码为Huffman二进制文件的程序,以及另一个可以将Huffman文件解码为文本文件的程序可能会很有用。