最近研究了下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语言实现相关推荐

  1. MD5算法之C#程序 MD5算法描述

    MD5算法之C#程序 MD5算法描述 MD5算法描述 当我要写一个MD5算法的程序时,发现中英文的语言描述都有一些不确切的地方,某些个细节 讲得不清楚,或者说很费解.最后不得不拿出C语言的源程序来调试 ...

  2. 培训c语言程序,编程人员培训手册C语言程序设计基础

    <编程人员培训手册C语言程序设计基础>由会员分享,可在线阅读,更多相关<编程人员培训手册C语言程序设计基础(18页珍藏版)>请在人人文库网上搜索. 1.第2章:C语言程序设计基 ...

  3. 培训c语言程序,编程人员培训手册C语言程序设计基础.PPT

    编程人员培训手册C语言程序设计基础.PPT 第2章C语言程序设计基础,学习的意义,从本章开始我们正式进入C语言程序设计的学习,也许大家会问为什么我们要学习C语言呢 理由1因为C语言流行. 理由2因为C ...

  4. c语言程序的书写格式,C语言程序书写格式辅导

    C语言程序书写格式辅导 C语言具有语句简洁的特点,C语言程序的可读性比较差.因此,为了增强C语言的可读性,正确的书写格式就显得十分重要.同样一个程序采用不同的书写方法.尽管都可以得到相同的结果,有的书 ...

  5. c语言程序ising算法,蒙特卡罗Ising算法C的程序.doc

    蒙特卡罗Ising算法C的程序.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3 ...

  6. 小型温控系统c语言程序,pid算法温度控制c语言程序 - 全文

    温度控制PID自整定原理介绍 整定PID(三模式)控制器 整定温度控制器涉及设置比例.积分和微分值,以得到对特定过 程的可能的最佳控制.如果控制器不包含自动整定算法,或者自 动整定算法未提供适合特定应 ...

  7. 算法分支定界法C语言程序,常用算法大全-分枝定界

    任何美好的事情都有结束的时候.现在我们学习的是本书的最后一章.幸运的是,本章用到的大部分概念在前面各章中已作了介绍.类似于回溯法,分枝定界法在搜索解空间时,也经常使用树形结构来组织解空间(常用的树结构 ...

  8. fir滤波器算法c语言程序,FIR滤波器设计C语言程序

    实际可运行的FIR滤波器系数设计的C语言程序 #include"math.h" #include"stdio.h" /*n:滤波器的阶数,n是奇数时可用来设计各 ...

  9. fdtd算法的matlab程序,FDTD算法的Matlab程序

    <FDTD算法的Matlab程序>由会员分享,可在线阅读,更多相关<FDTD算法的Matlab程序(6页珍藏版)>请在人人文库网上搜索. 1.* 5= T$h;O % 3-D ...

  10. C语言控制结构程序设计,第3讲 C语言程序的基本控制结构_C语言程序设计(上)_pps_大学课件预览_高等教育资讯网...

    Page 1 C语言程序设计 清华大学 郑莉 安颖莲第三讲 C语言程序的基本控制结构参考书,计算机程序设计基础,第三章 ,C程序设计,第四章.第五章 Page 2 C语言程序设计 清华大学 郑莉 安颖 ...

最新文章

  1. python获取方法的装饰方法_python – 在一个方法上得到装饰器名称的内省?
  2. 前端 chrome查看html样式基本操作
  3. C++彩色数据流动界面
  4. mysql命令实践_MySQL:常用命令行
  5. linux不识别xfs,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  6. 将之前写完的猜数字游戏改为通过javabean_【沃德英语】好玩的单词游戏
  7. 那些在一个公司死磕了5-10年的测试员,最后都怎么样了?
  8. Recover Binary Search Tree -- LeetCode
  9. 51黑单片机论坛c语言,51黑论坛_51单片机轻松入门—基于STC15W4K系列
  10. 登录注册的业务逻辑流程梳理
  11. 《Python金融大数据风控建模实战》 第15章 神经网络模型
  12. 关于“嵌入式系统设计师”的了结。
  13. 大规模海量并发难题的本质
  14. 【学习笔记】Kruskal 重构树(BZOJ3551【ONTAK2010】Peaks加强版)
  15. ubuntu流量监控_ubuntu linux下测试实时网络网速流量监控的几种小工具命令方法
  16. STM32——舵机驱动
  17. 仿 Drools 决策表 Groovy 实现
  18. 祭奠自己逝去的三年时光
  19. Greedy is Good
  20. python中bool函数用法_在python中bool函数的取值方法

热门文章

  1. 超级表格企业版收费即将进行政策调整
  2. 快速分析京东物流详情,并导出EXCEL表格
  3. 移动硬盘位置不可用无法访问函数不正确修复方法?
  4. iPhone免越狱Git服务器搭建教程-iSH
  5. 小白猿笔记Day6(面向对象)
  6. 强智教务系统验证码识别 OpenCV
  7. linux下回收站无法清空 解决
  8. 嵌入式UI架构设计漫谈
  9. CISCO 基于时间访问控制
  10. Cura Engine 源码解析:Settings