• 大小: 6.84MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-11-09
  • 语言: 其他
  • 标签: c++  课程设计  huffma  

资源简介

功能要求 1. 针对一幅BMP格式的图片文件,统计256种不同字节的重复次数,以每种字节重复次数作为权值,构造一颗有256个叶子节点的哈夫曼二叉树。 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 << “ 打开文件失败 “ << std::endl;
}
while (infile.get((char&)ch))//获取文件信息
{
for (int g = 0; g < 256; g++)
{
if (ch == g) //统计字符频度
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;//有效字节
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 << “生成压缩文件:“ << filename << endl;
int len = sizeof(HEAD) + strlen(pFilename) + 1 + nbuf;
cout << “压缩文件大小为:“ << len << “B“ << endl;
double rate = len * 1.0 / sHead.length;
cout.setf(ios::fixed);
cout << “压缩率为:“ << setprecision(4) << rate << “%“ << endl;

return len;
}
char Str2Byte(const char * pBinStr)//将字符串转化为字节
{

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‘ };
// 开辟缓冲区
pBuffer = (char *)malloc(nbuf * sizeof(char));
FILE *fin = fopen(FileAdr “rb“);
if (!pBuffer)
{

cerr << “开辟缓冲区失败!“ << endl;
return ERROR;
}
char *pfag;
int pos = 0; // 缓冲区指针
int ch;
// 扫描文件,根据Huffman编码表对其进行压缩,压缩结果暂存到缓冲区中。
while ((ch = fgetc(fin)) != EOF)
{
strcat(cd HC[ch]); // 从pHC复制编码串到cd
// 压缩编码
while (strlen(cd) >= 8)
{
// 截取字符串左边的8个字符,编码成字节
pBuffer[pos++] = Str2Byte(cd);
// 字符串整体左移8字节
for (int i = 0; i < BYTESIZE - 8; 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\link.command.1.tlog
     文件        4350  2019-05-01 17:49  huffmanty\huffmanty\Debug\huffmanty.tlog\link.read.1.tlog
............此处省略29个文件信息

评论

共有 条评论