繁体   English   中英

如何将霍夫曼代码存储在二进制文件 c++ 中?

[英]How to store Huffman Codes in a binary file c++?

我正在研究一个 Huffman 项目来压缩文本文件。 我能够生成所需的代码。 我阅读了整个文件,并相应地将代码存储在“vector char”变量中。 我还填充了编码向量。

vector<char> padding(vector<char> text)
{

    int num = text.size();
    unsigned int pad_value = 32-(num%32);

    for(int i=0;i<pad_value;i++){
        text.push_back('0');
    }


    string pad_info = bitset<32>(pad_value).to_string();

    for(int i=pad_info.length()-1;i>=0;i--){
        text.insert(text.begin(),pad_info[i]);
    }

    return text;

}

我在 32 位的基础上进行了填充,因为我在想是否使用“无符号整数”数组将整数直接存储在二进制文件中,这样它们每 32 个字符占用 4 个字节。 我为此使用了这个 function:

vector<unsigned int> build_byte_array(vector<char> padded_text)
{
    vector<unsigned int> byte_arr;

    for(int i=0;i<padded_text.size();i+=32)
    {
        string byte="";
        for(int j=i;j<i+32;j++){
            byte += padded_text[j];
        }
        unsigned int b = stoul(byte,nullptr,2);
        //cout<<b<<":"<<byte<<endl;

        byte_arr.push_back(b);
    }

    return byte_arr;
}  

现在的问题是当我使用这个字节数组写入二进制文件时

    ofstream output("compressed.bin",ios::binary);
    for(int i=0;i<byte_array.size();i++){
        unsigned int a = byte_array[i];
        output.write((char*)(&a),sizeof(a));
    }

我得到一个比原始文本文件大的二进制文件。 我该如何解决或者我犯了什么错误。

编辑:我尝试压缩一个大约 2,493 KB 的文件(用于测试目的),它生成了一个 3,431 KB 的compressed.bin 文件。 所以,我不认为填充是这里的问题。 我也尝试使用 15KB 文件,但使用此算法后文件的大小总是增加。

我尝试使用:

for(int i=0;i<byte_array.size();i++){
        unsigned int a = byte_array[i];
        char b = (char)a;
        output.write((char*)(&a),sizeof(b));
    }

但是在使用它之后,我在解压缩文件时无法恢复原始字节数组。

unsigned int a = byte_array[i];
output.write((char*)(&a),sizeof(a));

写入的大小是sizeof(a) ,通常是 4 个字节。
unsigned int不是字节。 更适合字节的类型是std::byteuint8_tunsigned char

您正在使用填充扩展数据,因此如果您没有得到太多压缩或没有太多数据开始,output 可能很容易变大。

你不需要像你做的那样多地垫。 首先,当数据已经在字边界结束时(当num是 32 的倍数时),您将添加 32 位。 在这种情况下填充位。 其次,您在开始时插入 32 位来记录您填充了多少位,其中 5 位足以编码 0..31。 第三,你可以写字节而不是int s,所以最后的填充可以是 0..7 位,你可以在前面加上 3 位而不是 5 位。 总体填充可以从您当前的 33..64 位减少到 3..10 位。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM