資源簡介
功能要求
1. 針對一幅BMP格式的圖片文件,統(tǒng)計256種不同字節(jié)的重復次數,以每種字節(jié)重復次數作為權值,構造一顆有256個葉子節(jié)點的哈夫曼二叉樹。
2. 利用上述哈夫曼樹產生的哈夫曼編碼對圖片文件進行壓縮。
3. 壓縮后的文件與原圖片文件同名,加上后綴.huf(保留原后綴),如pic.bmp
壓縮后pic.bmp.huf
4. 解壓縮

代碼片段和文件信息
#include?
#include
#include?
#include?
#include?
#include?“FILEio.h“
using?namespace?std;
int?readFILE(HuffNode?hufftree[]?string?InFile)
{
std::fstream?infile;
unsigned?char?ch;
FILESTRUCT?z[256]?=?{?0?};
for?(int?k?=?0;?k?256;?k++)//初始化
z[k].fileid?=?k;
infile.open(InFile);?//打開文件
if?(!infile)
{
std::cout?<“?打開文件失敗?“?< }
while?(infile.get((char&)ch))//獲取文件信息
{
for?(int?g?=?0;?g?256;?g++)
{
if?(ch?==?g)?//統(tǒng)計字符頻度
z[g].sum++;
}
}
for?(int?m?=?0;?m<256;?m++)//冒泡排序
{
for?(int?n?=?m?+?1;?n?<=?255;?n++)
{
if?(z[n].sum?<=?z[m].sum)//頻度從小到大排序
{
int?temp1?=?z[n].sum;
z[n].sum?=?z[m].sum;
z[m].sum?=?temp1;
int?temp2?=?z[n].fileid;
z[n].fileid?=?z[m].fileid;
z[m].fileid?=?temp2;
}
}
}
for?(int?m?=?0;?m<256;?m++)//冒泡排序
{
for?(int?n?=?m?+?1;?n?<=?255;?n++)
{
if?(z[n].sum?<=?z[m].sum)//序號排序
{
int?temp2?=?z[n].fileid;
z[n].fileid?=?z[m].fileid;
z[m].fileid?=?temp2;
}
}
}
int?d?=?0;//有效字節(jié)
for?(int?j?=?0;?j?256;?j++)//去掉頻度為0的字符
{
if?(z[j].sum?!=?0)
{
hufftree[d].ch?=?z[j].fileid;
hufftree[d].weight?=?z[j].sum;
d++;
}
}
infile.close();//關閉文件
return?d;//返回字符個數
}
int?WriteFile(const?char?*pFilename?const?HEAD?sHead?const?char?*pBuffer?const?int?nbuf)
{
//?生成文件名
char?filename[BYTESIZE?+?5]?=?{?‘\0‘?};
strcpy(filename?pFilename);
strcat(filename?“.huf“);
ofstream?fout(filenameios::binary);
fout.write((char*)&sHead?sizeof(HEAD));
fout.write(pBuffersizeof(char)?*?nbuf);
fout.close();
cout?<“生成壓縮文件:“?< int?len?=?sizeof(HEAD)?+?strlen(pFilename)?+?1?+?nbuf;
cout?<“壓縮文件大小為:“?< double?rate?=?len?*?1.0?/?sHead.length;
cout.setf(ios::fixed);
cout?<“壓縮率為:“?<
return?len;
}
char?Str2Byte(const?char?*?pBinStr)//將字符串轉化為字節(jié)
{
char?b?=?0x00;
for?(int?i?=?0;?i?8;?i++)
{
b?=?b?<1;//?左移1位
if?(pBinStr[i]?==?‘1‘)?{
b?=?b?|?0x01;
}
}
return?b;
}
int?Encode(const?char?*?FileAdr?const?HuffmanCode?HC?char?*pBuffer?const?int?nbuf)
{
char?cd[BYTESIZE]?=?{?‘\0‘?};?char?d0[BYTESIZE]?=?{?‘\0‘?};
//?開辟緩沖區(qū)
pBuffer?=?(char?*)malloc(nbuf?*?sizeof(char));
FILE?*fin?=?fopen(FileAdr?“rb“);
if?(!pBuffer)
{
cerr?<“開辟緩沖區(qū)失敗!“?< return?ERROR;
}
char?*pfag;
int?pos?=?0; //?緩沖區(qū)指針
int?ch;
//?掃描文件,根據Huffman編碼表對其進行壓縮,壓縮結果暫存到緩沖區(qū)中。
while?((ch?=?fgetc(fin))?!=?EOF)
{
strcat(cd?HC[ch]); //?從pHC復制編碼串到cd
//?壓縮編碼
while?(strlen(cd)?>=?8)
{
//?截取字符串左邊的8個字符,編碼成字節(jié)
pBuffer[pos++]?=?Str2Byte(cd);
//?字符串整體左移8字節(jié)
for?(int?i?=?0;?i? {
cd[i]?=?cd[i?+?8];
}
}
}
fclose(fin);
fin?=?NULL;
if?(strlen(cd)?>?0)
{
pBuffer[pos++]?=?Str2Byte(cd);
}
return?OK;
}
int?Compress(const?
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2019-05-01?18:39??huffmanty\
?????目錄???????????0??2019-05-01?11:16??huffmanty\Debug\
?????文件??????124928??2019-05-01?17:49??huffmanty\Debug\huffmanty.exe
?????文件??????881612??2019-05-01?17:49??huffmanty\Debug\huffmanty.ilk
?????文件?????1044480??2019-05-01?17:49??huffmanty\Debug\huffmanty.pdb
?????文件???????13934??2019-05-01?18:59??huffmanty\README.md
?????目錄???????????0??2019-05-01?18:28??huffmanty\huffmanty\
?????文件?????????269??2019-05-01?17:03??huffmanty\huffmanty\1.huf
?????文件???????42229??2018-04-16?16:40??huffmanty\huffmanty\1.png
?????文件???????42229??2019-05-01?11:23??huffmanty\huffmanty\1.png.png
?????文件?????1036918??2017-12-25?14:16??huffmanty\huffmanty\111.bmp
?????文件??????147493??2019-05-01?11:24??huffmanty\huffmanty\111.huf
?????文件?????1036918??2019-05-01?11:24??huffmanty\huffmanty\111.huf.bmp
?????文件??????811689??2018-04-16?16:40??huffmanty\huffmanty\2.png
?????文件???????10167??2019-04-29?19:52??huffmanty\huffmanty\3.png
?????文件?????1244231??2019-05-01?18:26??huffmanty\huffmanty\4.huf
?????文件?????1866866??2019-05-01?18:26??huffmanty\huffmanty\4.jpg
?????文件?????1866866??2018-07-27?11:03??huffmanty\huffmanty\ChMkJlbKwv2IJp20ABx8cnbTMTQAALGwAK5g-MAHHyK648.jpg
?????目錄???????????0??2019-05-01?17:49??huffmanty\huffmanty\Debug\
?????文件??????280542??2019-05-01?17:49??huffmanty\huffmanty\Debug\FILEio.obj
?????文件???????13988??2019-04-26?20:42??huffmanty\huffmanty\Debug\create_huffman.obj
?????文件???????69426??2019-05-01?11:12??huffmanty\huffmanty\Debug\huffmantree.obj
?????文件???????71529??2019-04-30?18:44??huffmanty\huffmanty\Debug\huffmantree.obj.enc
?????文件?????????237??2019-05-01?17:49??huffmanty\huffmanty\Debug\huffmanty.log
?????目錄???????????0??2019-05-01?17:49??huffmanty\huffmanty\Debug\huffmanty.tlog\
?????文件????????3122??2019-05-01?17:49??huffmanty\huffmanty\Debug\huffmanty.tlog\CL.command.1.tlog
?????文件???????77016??2019-05-01?17:49??huffmanty\huffmanty\Debug\huffmanty.tlog\CL.read.1.tlog
?????文件????????4504??2019-05-01?17:49??huffmanty\huffmanty\Debug\huffmanty.tlog\CL.write.1.tlog
?????文件?????????223??2019-05-01?17:49??huffmanty\huffmanty\Debug\huffmanty.tlog\huffmanty.lastbuildstate
?????文件????????1492??2019-05-01?17:49??huffmanty\huffmanty\Debug\huffmanty.tlog\li
?????文件????????4350??2019-05-01?17:49??huffmanty\huffmanty\Debug\huffmanty.tlog\li
............此處省略29個文件信息
評論
共有 條評論