IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 数据处理方法LZW编码(C语言实现) -> 正文阅读

[C++知识库]数据处理方法LZW编码(C语言实现)

LZW编码简介
? ? ? ?LZW压缩算法的基本概念: LZW压缩有三个重要的对象:数据流(CharStream)、编码流(CodeStream) 和编译表(String Table)。 在编码时,数据流是输入对象(例如,一个字符串),编码流就是输出对象(经过压缩运算的编码数据);在解码时,编码流则是输入对象,数据流是输出对象;而编译表是在编码和解码时都须要用借助的对象。
LZW编码过程
? ? ? ?LZW编码的过程就是构造一一个词 典的过程,首先将基本的根字符(Root) 存入字典,并为根字符分别按顺序赋予相应的编码值(一个编码为一个8位无符号整数)。在编码的过程中,将码流中常出现的字符串存入词典中,并为其赋予编码值。当码流中出现了词典中记录的字符串时,直接用词典中该字符串的编码来表示该字符串以实现信息压缩的功能。

参数介绍
①字符(Character): 最基础的数据元素,本赛题中只有A,B,C三种字符。
②字符串(String): 由几个连续的字符组成,本赛题中由前缀+当前字符构成。
③前缀(Prefix): 是一一个字符或字符串,不过通常用在另-一个字符的前面,而且它的长度可以为0;
④根(Root):长度为- -的字符串(单字符),本赛题中指的是存在词典中‘A’,‘B’,‘C'三个基本字符,并为其分别赋予相应的编码值( 0x01, 0x02, 0x03);
⑤编码(Code): 一个8位无符号整数,本赛题中为词典中存放的每个字符串所对应的序号。

编码算法
步骤1:开始时,词典中包含所有可能的根(Root),而当前前缀P是空的;
步骤2:当前字符(C) : =字符流中的下一个字符;
步骤3:判断缀符串P+C是否在词典中
(1)如果“是”: P : =P+C//(用C扩展P),跳至步骤4 ;
(2)如果“否”
①把代表当前前缀P的编码输出到编码流;
②把缀-符串P+C添加到词典,并为新添加的字符串分配编码值;
③令P: =C //(现在的P仅包含-一个字符C);
步骤4:判断码字 流中是否还有码字要译
(1) 如果“是”,就返回到步骤2;
(2)如果“否”
①把代表当前前缀P的码字输出到编码流;
②结束。

void lzwFun(char *input)		 //	算法实现
{
	int len = strlen(input);	//	求出字符串长度
	int i=0,j=0,k=0;					//	循环变量
	char ch = 0;				//	当前字符
	char preCharFlag = 0;
	for(i=0;i<len;i++)
	{
		Currentchar[0] = input[i];
		strcat(preChar,pre);			// pre  --- preChar
		strcat(preChar,Currentchar);    // Currentchar --- preChar
		
		for(j=1;j<lenFlag;j++)
		{
			if(strcmp(root[j],preChar) == 0)
			{
				puts("字典中有");
				preCharFlag = 1;		//	表示字典中已经存在,不需要增加
				break;
			}
		}
		if(0 == preCharFlag)		//	字典中没有的情况
		{
			strcpy(root[lenFlag],preChar);
			for(k=1;k<lenFlag;k++)
			{
				if(strcmp(root[k],pre) == 0)
				{
					preCode = k;
					break;
				}
			}
			OutputBitStream[lenFlag] = preCode;
			strcpy(pre,Currentchar);				//	当前字符作为前缀
			lenFlag++;
			strcpy(preChar,"");				//	清除pre+char

		}
		else						//	字典中有的情况
		{
			preCharFlag = 0;		//	置为初始值
			strcpy(pre,preChar);
			strcpy(preChar,"");				//	清除pre+char
		}
			
	}

	puts(pre);

	//当没有字符读入的处理
	for(k=1;k<lenFlag;k++)
	{
		if(strcmp(root[k],pre) == 0)
		{
			preCode = k;
			break;
		}
	}
	OutputBitStream[lenFlag] = preCode;
	printf("码字:\t\t");
	for(i=0;i<10;i++)
	{
		printf("%-5d ",i);
	}
	puts("");			//	换行
	printf("字典:\t\t");
	for(i=0;i<10;i++)
	{
		printf("%-5s ",root[i]);
	}
	puts("");			//	换行
	printf("输出码流:\t");
	for(i=0;i<10;i++)
	{
		printf("%-5d ",OutputBitStream[i]);
	}
	puts("");			//	换行
}	

实现效果:

?源码链接:(51条消息) 数据处理方法LZW编码(C语言实现)-C文档类资源-CSDN文库

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-13 11:37:20  更:2022-05-13 11:38:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 14:29:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码