資源簡介
基于Qt實現的霍夫曼編碼的壓縮解壓縮程序。壓縮、解壓縮采用單獨一個線程,ui界面一個線程。

代碼片段和文件信息
#include?“huffman.h“
Huffman::Huffman(QThread?*parent)?:
????QThread(parent)
{
????for(int?k=0;k<256;k++)
????{
????????for(int?mask=128;mask>0;mask/=2)
????????{
????????????if((k&mask)==0)?dic[k].append(“0“);
????????????else?dic[k].append(“1“);
????????}
????}
}
void?Huffman::run()
{
????if(isCompress)
????{
????????this->ComAnalyse();
????????this->GenerateCompressFile();
????????emit?message(“Compress?Complete!“);
????}
????else
????{
????????this->DecomAnalyse();
????????emit?message(“Decompress?complete!“);
????}
}
void?Huffman::Compress(QString?comFile?QString?after)
{
????if(comFile==after)
????{
????????emit?error(“The?input?file?name?and?the?output?file?name?cann‘t?be?the?same!“);
????????return;
????}
????inFile.setFileName(comFile);
????outFile.setFileName(after);
????if(!CheckFile())?return;
????isCompress=true;
????this->start();
}
void?Huffman::Decompress(QString?decomFile?QString?after)
{
????if(decomFile==after)
????{
????????emit?error(“The?input?file?name?and?the?output?file?name?cann‘t?be?the?same!“);
????????return;
????}
????inFile.setFileName(decomFile);
????outFile.setFileName(after);
????if(!CheckFile())?return;
????isCompress=false;
????this->start();
}
bool?Huffman::CheckFile()
{
????if(!inFile.exists())
????{
????????emit?error(“File?doesn‘t?exist!“);
????????return?false;
????}
????if(outFile.exists())
????{
????????return?QMessageBox::question(NULL“OverWrite?““File?exists!?OverWrite?it?“);
????}
????return?true;
}
void?Huffman::ComAnalyse()
{
????statisticMap.clear();
????char?c;
????inFile.open(QIODevice::ReadOnly);
????emit?message(“Analysing?File!“);
????while(!inFile.atEnd())
????{
????????inFile.getChar(&c);
????????if(statisticMap.contains(c))?statisticMap[c]++;
????????else?statisticMap[c]=0;
????}
????emit?message(“Generating?Huffman?Tree!“);
????tree.Generate(statisticMapcodeMap);
????inFile.close();
}
void?Huffman::GenerateCompressFile()
{
????emit?message(“Generating?compressed?file!“);
????outFile.open(QIODevice::WriteOnly);
????QByteArray?headercontent;
????char?c;
????int?mapSize=codeMap.size();
????int?zero=0;
????inFile.open(QIODevice::ReadOnly);
????while(!inFile.atEnd())
????{
????????inFile.getChar(&c);
????????content.append(codeMap[c]);
????}
????zero=8-content.size()%8;
????if(zero==8)?zero=0;
????for(int?i=0;i ????header.append((char)zero);
????header.append((char)mapSize);
????QMap::iterator?it;
????for(it=codeMap.begin();it!=codeMap.end();it++)
????{
????????header.append(it.key());
????????header.append(this->formatCodeMap(it.value()));
????}
????outFile.write(header);
????bool?ok;
????QByteArray?after;
????after.clear();
????for(int?i=0;i ????{
????????after.append((char)content.mid(i8).toInt(&ok2));
????????emit?progress((i*100)/content.size());
????}
????emit?progress(100);
????outFile.write
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????308??2014-11-25?02:46??HuffmanCompress\.git\config
?????文件?????????73??2014-11-25?02:45??HuffmanCompress\.git\desc
?????文件????????103??2014-11-25?15:03??HuffmanCompress\.git\FETCH_HEAD
?????文件?????????23??2014-11-25?02:45??HuffmanCompress\.git\HEAD
?????文件????????177??2014-11-25?02:45??HuffmanCompress\.git\hooks\README.sample
?????文件????????992??2014-11-25?15:02??HuffmanCompress\.git\index
?????文件????????113??2014-11-25?02:45??HuffmanCompress\.git\info\exclude
?????文件????????511??2014-11-25?15:02??HuffmanCompress\.git\logs\HEAD
?????文件????????511??2014-11-25?15:02??HuffmanCompress\.git\logs\refs\heads\master
?????文件????????137??2014-11-25?02:46??HuffmanCompress\.git\logs\refs\remotes\origin\master
?????文件????????178??2014-11-25?02:45??HuffmanCompress\.git\ob
?????文件????????385??2014-11-25?02:46??HuffmanCompress\.git\ob
?????文件????????389??2014-11-25?14:59??HuffmanCompress\.git\ob
?????文件????????231??2014-11-25?15:02??HuffmanCompress\.git\ob
?????文件????????217??2014-11-25?02:45??HuffmanCompress\.git\ob
?????文件????????256??2014-11-25?02:46??HuffmanCompress\.git\ob
?????文件????????626??2014-11-25?14:59??HuffmanCompress\.git\ob
?????文件????????367??2014-11-25?02:45??HuffmanCompress\.git\ob
?????文件???????1697??2014-11-25?14:59??HuffmanCompress\.git\ob
?????文件???????2616??2014-11-25?02:46??HuffmanCompress\.git\ob
?????文件????????325??2014-11-25?02:46??HuffmanCompress\.git\ob
?????文件????????151??2014-11-25?02:45??HuffmanCompress\.git\ob
?????文件????????707??2014-11-25?14:59??HuffmanCompress\.git\ob
?????文件?????????89??2014-11-25?02:45??HuffmanCompress\.git\ob
?????文件????????442??2014-11-25?14:59??HuffmanCompress\.git\ob
?????文件????????389??2014-11-25?02:46??HuffmanCompress\.git\ob
?????文件????????141??2014-11-25?02:46??HuffmanCompress\.git\ob
?????文件????????557??2014-11-25?02:46??HuffmanCompress\.git\ob
?????文件????????589??2014-11-25?02:46??HuffmanCompress\.git\ob
?????文件????????171??2014-11-25?02:46??HuffmanCompress\.git\ob
............此處省略58個文件信息
評論
共有 條評論