lzw算法c语言程序,LZW算法压缩c语言实现
最近研究了下LZW算法,也看了很多这个方面的资料。LZW适合于文本文件,对于稍稍大点的流文件则出现压缩出来的文件大于源文件的情况。LZW有很多著名的实现程序,下面的程序以动态增加位数为出发点,利用哈希表来实现LZW的压缩。 哈希算法有二个,一个被我注释掉,二个都可以用。具体哪个好,我自己也没有测试。
/**********************************************************************
***********************************************************************/
#include
#include
#include
#define hashsize 4096
#define clear 256 /*清除标志位*/
#define teminate 257
#define not_used -1
#define MAXVAL(n) (( 1 <
#define max_bits 12
FILE *in;
FILE *out;
int bitsize = 9;
int maxcode;
/*字典数据结构*/
typedef struct prex_cha{
int value; /*值*/
unsigned int prefix; /*字符串*/
unsigned int character; /*追加的字母*/
}Hash_Table;
Hash_Table Hash_table[hashsize];
void initial_hashtable ()/*字典初始化*/
{
int i;
for (i=0; i
{
Hash_table[i].value = not_used;
}
}
/*把数据改写成bit流输出*/
void output (unsigned int code)
{
static int count = 0;
static unsigned long buffer = 0L; /*buffer 为定义的存储字节的缓冲区*/
buffer |= (unsigned long) code << (32 - bitsize - count);
count += bitsize;
while (count >= 8) /*如果缓冲区大于8则输出里面的前8位*/
{
fputc(buffer >> 24,out);
buffer <<= 8;
count -= 8;
}
}
/*
int find_match(int prefix,unsigned int character)
{
int index;
int offset; /*offset为偏移位*/
/* index = (character << 4) ^ prefix; /*用异或来决定index*/
/* if (index == 0)
{
offset = 1;
}
else
{
offset = 5021 - index;
}
while (1)
{
if (Hash_table[index].value == not_used)
{
return (index);
}
if (Hash_table[index].prefix == prefix && Hash_table[index].character == character)
{
return (index);
}
index -= offset;
if (index < 0)
{
index += 5021;
}
}
}
*/
int find_match(int prefix,unsigned int character)
{
int index;
index = prefix % 4096;
while (1)
{
if(Hash_table[index].value == not_used)
{
return (index);
}
if(Hash_table[index].prefix == prefix && Hash_table[index].character == character)
{
return (index);
}
index = index + 1;
if(index >= 4096)
{
index = index - 4096;
}
}
}
void lzwcompression ()
{
unsigned int prefix;
unsigned int character;
unsigned int index;
unsigned int next_code = 258; /* 当前字典的标号*/
initial_hashtable ();
prefix = fgetc (in);
while ((character = fgetc(in)) !=(unsigned) EOF)
{
index = find_match (prefix,character);
if (Hash_table[index].value != not_used)/*能够找到*/
{
prefix = Hash_table[index].value;
}
else
{
if(next_code <= maxcode)/*不能找到,是新的字符串,则添加到表中*/
{
Hash_table[index].value = next_code++;
Hash_table[index].character = character;
Hash_table[index].prefix = prefix;
}
output(prefix);
prefix = character; /*把后缀给前缀,准备下次输入*/
/*特殊标志,当位数必须增加时*/
if(next_code > maxcode)
{
if(bitsize < 12)
{
maxcode = MAXVAL(++bitsize);
}
else /*达到4096时候,必须清除哈希表,重新开始*/
{
output (256); /*输出清除标志到文件中*/
initial_hashtable();
next_code = 258;
bitsize = 9;
maxcode = MAXVAL(bitsize);/*maxcode 变为511*/
}
}
}/*if-else结束*/
}/*while结束*/
output(prefix); /*输出最后一个*/
if (next_code == maxcode)
{ /* 如果在最后的哈息表刚好刚好是maxcode,则也必须把位数增加一位 */
++bitsize;
}
output(257); /* 输出结束标志*/
output(0); /* 解码时要用到 */
output(0);
output(0);
}
int main(int argc,char* argv[])
{
char filename[255];
if (argc < 2)
{
printf("usage:the command format is:lzw_compression !");
return(1);
}
if( (in = fopen(argv[1], "rb")) == NULL)
{
printf ("Cannot open input file - %s/n", argv[1]);
exit (1);
}
strcpy(filename, argv[1]);
/*加上后缀.zzz,表明是压缩文件*/
strncat(filename, ".zzz", 4);
if ((out = fopen(filename, "wb")) == NULL)
{
printf("Cannot open output file - %s/n", filename);
fclose(in);
exit(1);
}
maxcode = MAXVAL(bitsize);
lzwcompression();
fclose (in);
fclose (out);
return 0;
}
lzw算法c语言程序,LZW算法压缩c语言实现相关推荐
- MD5算法之C#程序 MD5算法描述
MD5算法之C#程序 MD5算法描述 MD5算法描述 当我要写一个MD5算法的程序时,发现中英文的语言描述都有一些不确切的地方,某些个细节 讲得不清楚,或者说很费解.最后不得不拿出C语言的源程序来调试 ...
- 培训c语言程序,编程人员培训手册C语言程序设计基础
<编程人员培训手册C语言程序设计基础>由会员分享,可在线阅读,更多相关<编程人员培训手册C语言程序设计基础(18页珍藏版)>请在人人文库网上搜索. 1.第2章:C语言程序设计基 ...
- 培训c语言程序,编程人员培训手册C语言程序设计基础.PPT
编程人员培训手册C语言程序设计基础.PPT 第2章C语言程序设计基础,学习的意义,从本章开始我们正式进入C语言程序设计的学习,也许大家会问为什么我们要学习C语言呢 理由1因为C语言流行. 理由2因为C ...
- c语言程序的书写格式,C语言程序书写格式辅导
C语言程序书写格式辅导 C语言具有语句简洁的特点,C语言程序的可读性比较差.因此,为了增强C语言的可读性,正确的书写格式就显得十分重要.同样一个程序采用不同的书写方法.尽管都可以得到相同的结果,有的书 ...
- c语言程序ising算法,蒙特卡罗Ising算法C的程序.doc
蒙特卡罗Ising算法C的程序.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3 ...
- 小型温控系统c语言程序,pid算法温度控制c语言程序 - 全文
温度控制PID自整定原理介绍 整定PID(三模式)控制器 整定温度控制器涉及设置比例.积分和微分值,以得到对特定过 程的可能的最佳控制.如果控制器不包含自动整定算法,或者自 动整定算法未提供适合特定应 ...
- 算法分支定界法C语言程序,常用算法大全-分枝定界
任何美好的事情都有结束的时候.现在我们学习的是本书的最后一章.幸运的是,本章用到的大部分概念在前面各章中已作了介绍.类似于回溯法,分枝定界法在搜索解空间时,也经常使用树形结构来组织解空间(常用的树结构 ...
- fir滤波器算法c语言程序,FIR滤波器设计C语言程序
实际可运行的FIR滤波器系数设计的C语言程序 #include"math.h" #include"stdio.h" /*n:滤波器的阶数,n是奇数时可用来设计各 ...
- fdtd算法的matlab程序,FDTD算法的Matlab程序
<FDTD算法的Matlab程序>由会员分享,可在线阅读,更多相关<FDTD算法的Matlab程序(6页珍藏版)>请在人人文库网上搜索. 1.* 5= T$h;O % 3-D ...
- C语言控制结构程序设计,第3讲 C语言程序的基本控制结构_C语言程序设计(上)_pps_大学课件预览_高等教育资讯网...
Page 1 C语言程序设计 清华大学 郑莉 安颖莲第三讲 C语言程序的基本控制结构参考书,计算机程序设计基础,第三章 ,C程序设计,第四章.第五章 Page 2 C语言程序设计 清华大学 郑莉 安颖 ...
最新文章
- python获取方法的装饰方法_python – 在一个方法上得到装饰器名称的内省?
- 前端 chrome查看html样式基本操作
- C++彩色数据流动界面
- mysql命令实践_MySQL:常用命令行
- linux不识别xfs,51CTO博客-专业IT技术博客创作平台-技术成就梦想
- 将之前写完的猜数字游戏改为通过javabean_【沃德英语】好玩的单词游戏
- 那些在一个公司死磕了5-10年的测试员,最后都怎么样了?
- Recover Binary Search Tree -- LeetCode
- 51黑单片机论坛c语言,51黑论坛_51单片机轻松入门—基于STC15W4K系列
- 登录注册的业务逻辑流程梳理
- 《Python金融大数据风控建模实战》 第15章 神经网络模型
- 关于“嵌入式系统设计师”的了结。
- 大规模海量并发难题的本质
- 【学习笔记】Kruskal 重构树(BZOJ3551【ONTAK2010】Peaks加强版)
- ubuntu流量监控_ubuntu linux下测试实时网络网速流量监控的几种小工具命令方法
- STM32——舵机驱动
- 仿 Drools 决策表 Groovy 实现
- 祭奠自己逝去的三年时光
- Greedy is Good
- python中bool函数用法_在python中bool函数的取值方法