数据压缩试验三:LZW 编码原理与C语言实现

LZW编解码算法实现及编码效率分析 编码原理 第二类算法的想法是企图从输入的数据中创建一个“短语词典(dictionary of the phrases)”,这种短语可以是任意字符的组合。编码数据过程中当遇到已经在词典中出现的“短语”时,编码器就输出这个词典中的短语的“索引号”,而不是短语本身。这种编码方法被称为 LZW 压缩编码。 LZW只输出代表词典中的字符串(String)的码字(code word)。这就意味着在开始时词典不能是空的,它必须包含可能在字符流中出现的所有单个字符。即在编码匹配时,至少可以在词典中找到长度为1的匹配 阅读详情

LZW 编解码原理

背景

LZW 编码作为词典编码的一种,由 J. Ziv 和 A. Lempel 在 1978 年首次提出并由 Terry A. Welch 在 1984 年改进,最终以三人名字缩写命名。

基本原理

企图从输入的数据中创建一个“短语词典”(Dictionary Of the Phrases),这种短语可以是任意字符的组合。编码数据过程中当遇到已经在词典中出现的“短语”时,编码器就会输出这个词典中的短语的“索引号”而不是短语本身,进而达到压缩的目的。

编码

编码思路

将当前读取到的单字符记为 C(Current),将之前读取的但还未编码的字符或字符串记为 P(Previous),则编码思路可以通过以下流程图呈现
在这里插入图片描述
在最终的代码实现中,通过树的思想对词典进行构建,将每一个词条作为树中的一个节点,将每个节点(词条)定义为结构体,具有以下结构

  • 尾缀字符(suffix)
  • 母节点(parent)
  • 第一个子节点(firstChild)
  • 下一个兄弟节点(nextSibling)

此时每一个节点就可以用旧节点词条+新字符表示新的节点词条,进而简化查询步骤。

编码举例

现在以字符流“abbababac”举例,分别进行编码步骤演示与树的建立,初始化词典是用 ASCII 进行索引(a = 97,b = 98,c = 99)

步骤数 P C PC 是否在词典中 是否输出 P的索引 新增词条 说明
1 NULL a - - - 初始化词典
2 a b 否 是,输出97 256(ab) ab 不在词典中,扩充词典,然后 P 变为 b
3 b b 否 是,输出98 257(bb) bb 不在词典中,扩充词典,然后 P 变为 b
4 b a 否 是,输出98 258(ba) ba 不在词典中,扩充词典,然后 P 变为 a
5 a b 是 否 - ab 在词典中,故不需要新建词条,P 变为 ab
6 ab a 否 是,输出256 259(aba) aba 不在词典中,扩充词典,然后 P 变为 a
7 a b 是 否 - ab 在词典中,故不需要新建词条,P 变为 ab
8 ab a 是 否 - aba 在词典中,故不需要新建词条,P 变为 aba
9 aba c 否 是,输出259 260(abac) abac 不在词典中,扩充词典,然后 P 变为 c
10 c NULL - 是,输出99 - 无新的字符,结束编码,输出未编码字符

相应的树为下图所示
在这里插入图片描述
以词条 “bb”为例,他的 suffix 为 b,parent 为 b,firstChild 为 NULL,nextSibling 为 ba

解码

解码思路

将当前码字记为 cW,上一个码码字记为 pW,解码思路可以通过以下框图体现
在这里插入图片描述
因为在实时编解码时,解码要比编码晚一个码字,因而存在码字词条刚被创造就被使用但在解码端还没有相应词条的情况(比如上述编码示例中的 “ababa” 字段),所以在查词典时判断若 cW 不在词典时便手动定义当前码字代表内容为“上一码字代表内容+上一码字代表内容的首字符”,以解决此类问题。

解码举例

词典在最开始已被初始化为 ASCII 码表内容,此处以“97 98 98 256 259 99”作为带解码流

步骤数 pW cW cW 是否在词典中 输出内容 新增词条 说明
1 NULL 97 是 a - 97 已经在词典中,因而输出 cW,新增 pW + cW 首字符
2 97 98 是 b ab: 256 98 已经在词典中,因而输出 cW,新增 pW + cW 首字符
3 98 98 是 b b b: 257 98 已经在词典中,因而输出 cW,新增 pW + cW 首字符
4 98 256 是 ab ba: 258 256 已经在词典中,因而输出 cW,新增 pW + cW 首字符
5 256 259 否 aba aba: 259 259 不在词典中,因而输出pW + pW 首字符,并将其添加到词典中
6 259 99 是 c abac: abac 99 已经在词典中,因而输出 cW,新增 pW + cW 首字符

代码实现

bitIO.h

#ifndef __BITIO__
#define __BITIO__

#include <stdio.h>

typedef struct
{
   
   
	FILE *fp;
	unsigned char mask;
	int rack;
}BITFILE;

BITFILE *OpenBitFileInput( char *filename);
BITFILE *OpenBitFileOutput( char *filename);
void CloseBitFileInput( BITFILE *bf);
void CloseBitFileOutput( BITFILE *bf);
int BitInput( BITFILE *bf);
unsigned long BitsInput( BITFILE *bf, int count);
void BitOutput( BITFILE *bf, int bit);
void BitsOutput( BITFILE *bf, unsigned long code, int count);
#endif	// __BITIO__

bitIO.c

#include <stdlib.h>
#include <stdio.h>
#include "bitio.h"
BITFILE *OpenBitFileInput( char *filename)
{
   
   
	BITFILE *bf;
	bf = (BITFILE *)malloc( sizeof(BITFILE));
	if( NULL == bf) return NULL;
	if( NULL == filename)	bf->fp = stdin;
	else bf->fp = fopen( filename, "rb");
	if( NULL == bf->fp) return NULL;
	bf->mask = 0x80;
	bf->rack = 0;
	return bf;
}

BITFILE *OpenBitFileOutput( char *filename)
{
   
   
	BITFILE *bf;
	bf = (BITFILE *)malloc( sizeof(BITFILE));
	if( NULL == bf) return NULL;
	if( NULL == filename)	bf->fp = stdout;
	else bf->fp = fopen( filename, "wb");
	if( NULL == bf->fp) return NULL;
	bf->mask = 
LZW算法的原理与实现 LZW算法又叫“串表压缩算法”就是通过建立一个字符串表,用较短的代码来表示较长的字符串来实现压缩。 1.基本原理 提取原始文本文件数据中的不同字符,基于这些字符创建一个编译表,然后用编译表中的字符的索引来替代原始文本文件数据中的相应字符,减少原始数据大小。看起来和调色板图象的实现原理差不多,但是应该注意到的是,我们这里的编译表不是事先创建好的,而是根据原始文件数据动态创建的,解码时还要从已编码的数... 阅读详情

相关推荐

Sentinel-2数据转TIFF后文件太大?试试这个GDAL技巧,硬盘空间省一半!

本文详细介绍了如何利用GDAL高级压缩技巧优化Sentinel-2数据存储,将TIFF文件体积减少60%以上。通过BuildVRT与Translate组合、DEFLATE压缩算法及预测器技术,实现高效数据转换与存储优化,特别适合处理海量遥感数据。

dida4700的博客 534

【数据压缩】LZW编解码原理及算法实现

一、LZW简介 LZW压缩(LZW compression)是一种由Abraham Lempel、Jacob Ziv和Terry Welch发明的基于表查寻算法把文件压缩成小文件的无损压缩方法。 二、LZW编解码举例 1、LZW编码算法思想 举例:输入流 a b b a b a b a c 首先,以ASCII码为基础词典 已编码:a b 遇到a,用97表示,编码为97。 遇到b,用98表示,编码为98。 发现ab,加入词典,ab索引为256。 已编码:a b b a b 遇到b,编码为98,发

spadeK2020的博客 1万+

【信息科学与工程学】【物理/化学和工程技术】第七十五篇 电气工程 系列二 电路电气基础05 电感原理、电工材料

Umn​=mπ4Ud​​Jn​(mπM/2), 其中m为载波比索引,n为基波带索引,M为调制度,Jn​为贝塞尔函数。主要谐波位于fc​±2f1​, 2fc​±f1​等处。非线性环节的描述函数N(A)=AY1​​ejϕ1​, 其中Y1​, ϕ1​为输出基波分量的幅值和相位。对于简单一维模型,存在一个临界电压Ucr​,当U>Ucr​时,无稳定热平衡解,发生热击穿。对带通信号(中心频率fc​, 带宽B)进行采样时,只要采样频率fs​满足一定条件,可避免频谱混叠,且fs​可远低于2fc​。

weixin_49199313的博客 472

【信息科学与工程学】【控制科学】第十二篇 微型计算机控制技术01

更精确的经典模型:I1在第5周期WB结束,I2最早可在第6周期进入EX,但I2在ID阶段就需要R1,因此I2的ID需在第6周期,而I1的WB在第5周期,所以I2的ID可以紧接在第6周期,但中间仍有一个stall(因为I1的EX结果要等到MEM之后才能转发给ID?有优先级继承后,Task_L被提升优先级,不会被Task_M抢占,阻塞时间缩短为Task_L剩余执行时间(9ms),仍可能超过10ms,但可通过调整任务周期或使用中断处理缓解。电感L=10μH,输出电容C=100μF,ESR=5mΩ。

weixin_49199313的博客 8637

【信息科学与工程学】【人工智能】第一篇 人工智能算法知识库01

编号格式说明示例数量分配​8位数字,前2位主类,中间2位子类,后4位序号99,999,999个。

weixin_49199313的博客 1876

C语言实现LZW编码

用C语言实现LZW编码,之前在网上看到都是C++版的,做了修改。现在是C语言班,信息论大作业,或者C语言作业都都行

用LZW压缩算法实现的编码与解码

压缩文件有两个源码文件LZWCode.cpp和LZWDecode.cpp可以实现LZW的编码与解码,并有简要的使用说明文档。

基于NE555的触摸延时开关电路设计与实现

本文详细介绍了基于NE555芯片的触摸延时开关电路设计与实现方法。通过分析NE555的单稳态工作模式,结合定时电阻、电解电容等关键元件选型,提供了一套完整的电路搭建方案。文章还包含抗干扰设计、调试技巧及常见故障处理,帮助电子爱好者快速掌握触摸延时灯的制作要点。

weixin_29268267的博客 788

芯片设计流程中的def文件

在实际的DEF文件中,每个部分都包含了与实际设计相关的详细信息,这个模板只展示了每个部分的基本结构。在实际应用中,DEF文件通常由EDA(电子设计自动化)工具在完成布局(Placement)和布线(Routing)步骤后自动生成,在集成电路设计中,DEF(Design Exchange Format)文件的模板具体内容会依设计的复杂性和特定需求而变化。简而言之,LEF文件提供了单元的物理特性和规则,而DEF文件使用这些规则来确定单元。)文件描述了特定设计中所有物理元素的精确放置和连线信息。

qq_36045093的博客 4863

FFmpeg视频编码的流程详解及参考demo

本文主要讲解FFmpeg的视频编码的具体流程,API使用。最后再以一个非常简单的demo演示将一个yuv数据文件编码为H264的视频文件,也就是YUV编码为H264。

分享音视频技术 4499

Quartus (Quartus Prime 18.1)的安装及仿真步骤

前两天做计组的课设需要用到Quartus 这个软件,但安装有点麻烦,在网上搜了很多教程,发现都是旧版本的,最后弄了好半天才把环境搭建好。所以,分享一下它的搭建过程。 因为我不经常用它,所以安装的版本是精简版的其他版本的也应该差不多以下是需要下载的安装包: 准备: Quartus Prime 精简版,最新发布: v18.1 1. QuartusLiteSetup-18.1.0.625-wi...

weixin_41082948的博客 8万+

手把手教你用RoboTwin训练RDT模型:从环境配置到实战微调(避坑指南)

本文提供了一份详尽的避坑指南,手把手教你如何在RoboTwin开源仿真环境中,从零开始配置环境、采集数据并完成RDT视觉语言动作模型的实战微调。文章涵盖了环境搭建、数据流水线构建、模型配置与训练等关键步骤,旨在帮助研究者和开发者高效利用仿真数据,低成本探索具身智能应用。

weixin_29094979的博客 132

算力网:正在编织的“第二电网“

中国算力网:编织智能时代的"第二电网" 中国正在构建全国一体化算力网,目标让算力资源像水电一样即取即用。这一国家战略通过"东数西算"布局,将东部算力需求与西部清洁能源优势结合,形成三级时延圈(1ms城市级、5ms区域级、20ms国家级)。算力网采用三层架构:基础设施层的八大枢纽节点作为"发电厂",编排管理层的智能调度系统作为"调度中心",运营服务层提供标准化算力服务。关键技术包括算力路由、异构算力统一度量、无损网络和液冷技术等。

这只是一个博客 669

ppt保存时嵌入字体,但找不到字体使用的位置的解决办法

摘要 当PPT提示无法保存嵌入字体时,可通过VBA代码快速定位使用该字体的文本。具体步骤如下: 按ALT+F11打开VBA编辑器,新建模块并粘贴提供的代码; 运行代码后输入目标字体名称(如“方正兰亭黑简体”); 程序将列出所有使用该字体的幻灯片编号及对应文本内容; 修改这些文本的字体即可解决保存问题。该方法高效精准,适用于排查PPT字体嵌入失败的情况。(150字)

智慧空间实验室 1401

25、量子计算:中性原子与约瑟夫森结量子比特

本文详细探讨了中性原子和约瑟夫森结两种量子比特在量子计算中的应用。中性原子量子比特利用光晶格实现量子态的操控,具有长相干时间的优势,但面临可扩展性和多量子比特操作的挑战;而约瑟夫森结量子比特基于超导技术,结合半导体制造工艺,具有低耗散和潜在的高可扩展性,但在参数控制和环境干扰方面存在难题。文章还比较了这两种方案的性能、应用场景及未来发展趋势,展望了它们在量子计算发展中的潜力与突破方向。

ol789012的博客 212

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: 数据压缩试验二:TGA 文件转 YUV 文件的 C++ 实现方法
下一篇: 数据压缩试验四:使用 DPCM 编码进行图像压缩
ZACH( ???)
博客等级 码龄7年 11粉丝 14原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值