[英]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::byte
、 uint8_t
或unsigned 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.