• 大小: 12KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-09
  • 语言: C/C++
  • 标签: huffman  压缩  c语言  

资源简介

基于huffman编码的文件解压缩程序 采用c语言编写,支持文件的解压缩功能 供学习交流,大型文件请不要尝试,可能会很慢

资源截图

代码片段和文件信息

#include“huffman.h“

//#include
static int get_file_name(char* destchar* srcint len);
char tmp_code[260];
static int search_code(struct huffman* hufPHNODE phnodechar codeint depth);

static int get_file_name(char* destchar* srcint dest_lenint src_len)
{
if(dest==NULL||src==NULL){
return 0;
}
int i=0;
for(i=src_len-1;i>=0;i--){
if(src[i]==‘\\‘){
break;
}
}
if(i==0){
return 0;
}
memset(dest0dest_len);
strncpy(dest&src[i+1]src_len-i-1);
return 1;
}

int huffman_inti(struct huffman* huf)
{
// huf->f_size=NULL;
memset(huf->file_path0strlen(huf->file_path));
huf->f_src=NULL;
for(int i=0;i!=256;i++){
huf->freq[i]=0;
for(int j=0;j!=265;j++){
huf->hf_table[i][j]=0;
}
}
prlist_inti(&huf->plist);
huf->huf_tree_head=NULL;
return R_OK;

}

int read_file(struct huffman* hufchar* path)
{

HANDLE h_file;
HANDLE h_filemap;
DWORD  f_hsize;
void *src;
for(int i=0;i!=90;i++){
if(path[i]==‘\n‘){
path[i]=0;
}
}
//CString str_path(path);
// Create file kernel object
h_file= CreateFile (path GENERIC_READ|GENERIC_WRITE \
FILE_SHARE_READ|FILE_SHARE_WRITE NULL OPEN_EXISTING FILE_ATTRIBUTE_NORMAL NULL ) ;
if ( h_file == INVALID_HANDLE_VALUE )
return RD_ERO;

// Get file size
huf->f_size= GetFileSize ( h_file &f_hsize ) ;
// Create file mapping object 
h_filemap = CreateFileMapping ( h_file NULL PAGE_READWRITE 0 0 NULL ) ;
if ( h_filemap == NULL )
{
CloseHandle ( h_filemap ) ;
return false ;
}
src = MapViewOfFile ( h_filemap FILE_MAP_READ 0 0 f_hsize ) ;
if ( src == NULL )
{
CloseHandle ( h_filemap) ;
CloseHandle ( h_file ) ;
return false ;
}
huf->f_src=src;
strcpy(huf->file_pathpath);
huf->h_file=h_file;
huf->h_filemap=h_filemap;
return R_OK;
}

int stat_frequency(struct huffman* huf)
{
    DWORD size=huf->f_size;
unsigned char* src=(unsigned char*)(huf->f_src);
for(DWORD i=0;i!=size;i++){
huf->freq[src[i]]++;
}
return R_OK;
}

int inti_prlist(struct huffman* huf)
{
static int j=0;
PHNODE phnode;

// PHNODE parray=(PHNODE)malloc(sizeof(PHNODE)*256);
    PHNODE parray=huf->plist.pharray;
for(int i=0;i!=256;i++){
if(huf->freq[i]==0){
continue;
}
phnode=&(parray[j]);
j++;
phnode->mark=i;
phnode->value=huf->freq[i];
phnode->isleaf=1;
phnode->lnode=phnode->rnode=NULL;
prlist_insert(&(huf->plist)phnode);
}
return R_OK;
}

int build_huf_tree(struct huffman* huf)
{
PHNODE lnode;
PHNODE rnode;
PHNODE fnode;
static int i=256;
    PHNODE parray=huf->plist.pharray;
while(huf->plist.size>1){
prlist_delete(&(huf->plist)&lnode);
prlist_delete(&(huf->plist)&rnode);
fnode=&(parray[i]);
i++;
// fnode=(PHNODE)malloc(sizeof(PHNODE));
fnode->mark=0;
fnode->isleaf=0;
fnode->lnode=lnode;
fnode->rnode=rnode;
fnode->value=lnode->value+rnode->value;

prlist_insert(&(huf->plist)

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       7805  2012-11-14 15:32  huffman\huffman.cpp

     文件      28160  2012-11-14 15:39  huffman\huffman.exe

     文件        588  2012-11-14 15:31  huffman\huffman.h

     文件       1334  2012-11-14 15:39  huffman\main.cpp

     文件       1772  2012-11-14 15:22  huffman\prlist.cpp

     文件        299  2012-11-09 16:44  huffman\prlist.h

     文件       1111  2012-11-14 15:31  huffman\typedefine.h

     目录          0  2012-11-14 15:40  huffman

----------- ---------  ---------- -----  ----

                41069                    8


评论

共有 条评论