【手打】LZW编码的C/C++实现

LZW编码通过建立一个字符串表,用较短的代码来表示较长的字符串来实现压缩。 LZW压缩算法是Unisys的专利,有效期到2003年,所以相关算法大多也已过期。

本代码仅仅完成了LZW的编码与解码算法功能,相对网上找到的很多代码而言较为简(cai)单(bi),了解struct && 会递归即可,算是优点吧。

#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>

using namespace std;

struct Node{
	int pre;					//前缀单词对应码字
	char c;						//当前字符
}KDA[65535];

int cnt,P,Q;
char W,V;

void Init(){					//前256个字典由对应ASCII码生成
	for(int i = 0;i < 256; i ++){
		KDA[i].pre = -1;
		KDA[i].c = i;
	}
	cnt = 256;
	P = -1;
}

void Out(int x){                            //递归输出码字对应单词,首位另存用于建立字典
    if(KDA[x].pre != -1){
        Out(KDA[x].pre);
    }
    else {
        V = KDA[x].c;
    }
    printf("%c",KDA[x].c);
}

void Search(){
    int flag = 0;
	for(int i = 0;i < cnt;i ++){
		if(KDA[i].pre == P && KDA[i].c == W){//字典已存在则更新前缀对应码字
			P = i;
			flag = 1;
        }
	}
	if(!flag){                  //不存在则扩充字典,输出前缀对应码字并更新前缀单词
        KDA[cnt].pre = P;
        KDA[cnt].c = W;
        printf("%03X ",P);
        P = (int)W;
        cnt ++;
    }
}

void Research(){
    Out(Q);
    if(P != -1){                //如果前一位码字不为空,则将前一位对应单词作为前缀与本单词第一位合并作为新单词加入字典
        KDA[cnt].pre = P;
        KDA[cnt].c = V;
        cnt ++;
    }
}

void Compress(){<span style="white-space:pre">		</span>//编码过程
	Init();
	freopen("LZWin.txt","r",stdin);
	freopen("LZWch.txt","w",stdout);
	while((W = getchar()) && W != EOF){
		Search();
	}
	printf("%03X\n",P);
}

void Decompress(){<span style="white-space:pre">		</span>//解码过程
    Init();
    freopen("LZWch.txt","r",stdin);
	freopen("LZWout.txt","w",stdout);
	while(scanf("%03X",&Q)!= EOF){
		Research();
	}
}

int main(){
    Compress();
    Decompress();
	return 0;
}
时间: 2024-11-16 09:02:51

【手打】LZW编码的C/C++实现的相关文章

LZW编码

原文:https://segmentfault.com/a/1190000011425787?utm_source=tag-newest LZW 算法引入 核心思想:把出现过的字符串映射到记号上,这样就可能用较短的编码来表示长的字符串,实现压缩 比如对于字符串 ABABAB 可以看到字串 AB 在后面重复了,就可以用一个特殊的记号表示 AB ,比如使用 2,原来的字符串就表示为 AB22 ,那么 2 就可以称为 AB 的记号 那么如果规定 0 表示 A,1 表示 B,实际上最后得到的压缩后的数据

音频视频编码知识

数据压缩的性能指标 压缩比: 越大越好 压缩质量 无损压缩 有损压缩 主观评分 客观尺度 均方误差 峰值信噪比 压缩速度和解压缩速度 大多数15 全动态25-30 在电话线上传送视频,因受线路传输的限制,帧率要求没有那么高,但也要求达到每秒5帧以上 数据冗余类型 空间冗余 时间冗余 信息熵冗余 视觉冗余 人类分辨能力为26灰度级 听觉冗余 20Hz - 20KHz 其他冗余 结构冗余...... 数据压缩分类 根据解码后的数据与原始数据是否一致进行分类: 有是真编码 无失真编码 根据编码原理分类

【转】gif文件格式详解

1.概述 ~~~~~~~~ GIF(Graphics Interchange Format,图形交换格式)文件是由 CompuServe公司开发的图形文件格式,版权所有,任何商业目的使用均须 CompuServe公司授权. GIF图象是基于颜色列表的(存储的数据是该点的颜色对应于颜色列表的索引值),最多只支持8位(256色).GIF文件内部分成许多存储块,用来存 储多幅图象或者是决定图象表现行为的控制块,用以实现动画和交互式应用.GIF文件还通过LZW压缩算法压缩图象数据来减少图象尺寸(关于LZ

noip2010普及组初赛

第十六届全国青少年信息学奥林匹克联赛初赛试题 ( 普及组 Pascal 语言 两小时完成) ●● 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效 ●● 一. 单项选择题(共20题,每题1.5分,共计30分.每题有且仅有一个正确答案.) 1.2E+03表示(   ).A.2.03              B.5                 C.8                 D.2000 2.一个字节(byte)由(  )个二进制位组成.A.8                 B.

流媒体 2——数据无损压缩

无损压缩是 指使用压缩后的数据进行重构(或者叫做还原,解压缩),重构后的数据与原来的数据完全相同:无损压缩用于要求重构的信号与原始信号完全一致的场合.一个很 常见的例子是磁盘文件的压缩.根据目前的技术水平,无损压缩算法一般可以把普通文件的数据压缩到原来的1/2-1/4.一些常用的无损压缩算法有霍夫曼 (Huffman)算法和LZW(Lenpel-Ziv & Welch)压缩算法,算术编码.RLE编码(行程长度编码)和词典编码. 有损压缩是指使用压缩后的数据进 行重构,重构后的数据与原来的数据有所

程序员需要了解的硬核知识之压缩算法

此篇文章是<程序员需要了解的硬核知识>第五篇文章,历史文章请戳 程序员需要了解的硬核知识之内存 程序员需要了解的硬核知识之CPU 程序员需要了解的硬核知识之二进制 程序员需要了解的硬核知识之磁盘 之前的文章更多的介绍了计算机的硬件知识,会有一些难度,本篇文章的门槛会低一些,一起来看一下计算机中都有哪些压缩算法 认识压缩算法 我们想必都有过压缩和 解压缩文件的经历,当文件太大时,我们会使用文件压缩来降低文件的占用空间.比如微信上传文件的限制是100 MB,我这里有个文件夹无法上传,但是我解压完成

程序员不得不了解的硬核知识大全

我们每个程序员或许都有一个梦,那就是成为大牛,我们或许都沉浸在各种框架中,以为框架就是一切,以为应用层才是最重要的,你错了.在当今计算机行业中,会应用是基本素质,如果你懂其原理才能让你在行业中走的更远,而计算机基础知识又是重中之重.下面,跟随我的脚步,为你介绍一下计算机底层知识. CPU 还不了解 CPU 吗?现在就带你了解一下 CPU 是什么 CPU 的全称是 Central Processing Unit,它是你的电脑中最硬核的组件,这种说法一点不为过.CPU 是能够让你的计算机叫计算机的核

LZW压缩算法

介绍 LZW算法是非常常见的一种压缩算法,他的压缩原理是对于多次重复出现的字符串,进行压缩,至于怎么压缩,在后文中会细细描述,LZW算法可以用在很多的场合,诸如图像压缩,文本压缩等等,而且算法简单易懂,并不是人们想象中的那么深奥. 算法原理 在介绍算法原理之前,得先明白几个概念: 1.Prefix,在这里代表前缀字符的意思. 2.Suffix,对应的意思是后缀字符的意思. 为什么提到这2个概念呢,是因为后面的字符的压缩的输入的过程就与这2者相关.这里假设压缩的是文本字符,字符内容如下: abab

iOS:Cocoa编码规范 -[译]Coding Guidelines for Cocoa

--原文地址:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/FrameworkImpl.html Cocoa编码规范 --前言 用公共API开发一个Cocoa框架,插件,或其他可执行目标,里面的命名编写和规范不同于一般应用程序的开发.因为你开发出来东西是给开发者用的看的,并且他们不熟悉你的编程接口.这个时候API的命名约定就派上用场了,因为它使你的写