资源简介
基于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
- 上一篇:C语言电子表格
- 下一篇:socket文件传输C++
相关资源
- C语言电子表格
- C语言linux实现ls功能
- 一个完整的des算法的c语言实现
- c语言RSA算法 这是一个完整的rsa算法
- tftp服务器源码,纯c语言
- 严蔚敏《数据结构》的全部代码实现
- LinuxC语言实现CP命令(edsionte.com)
- C语言指针详解__ppt文件
- FTP客户端程序,c语言编写
- C语言N皇后打印图形版
- Head First_深入浅出C语言(中文版)_带
- 唯一可译码源代码c语言 含报告
- 数据结构课程设计-班级通讯录
- AES密码学课程设计带报告
- 哈希表操作c语言版
- C语言版拼音输入法源代码
- C语言 真值表
- 51单片机C语言电流电压测量代码
- C语言编写Windows界面程序新手必看!附
- HMAC-MD5 C语言算法
- 公交信息查询系统 C语言.doc
- Flappy Bird C语言代码
- C语言课程设计—图书信息管理系统
- 机器人灭火比赛源程序C语言版本
- 支持向量机的C语言程序源码
- 矢量量化的C语言实现
- C语言实现的文件存储引擎
- 极其强大的C语言学生成绩管理系统(
- BACNet C语言代码,简单实用
- 能够移动的小方块,很多年前用C语言
评论
共有 条评论