数据的压缩存储与解压缩算法实现(C语言)

简介: 在一些嵌入式的项目设计中,空间是相当宝贵的,因为一个CPU的存储是有限的,所以此时我们在保存数据的时候,喜欢来进行压缩保存,著名的有哈夫曼树算法,专门用来做压缩的算法,当然,本节我们不讨论这些稍微高级的算法,写一个简单的例子,开发中遇见的,比如,我想把0xfe,0xf1,0x3e,0x3c这四个字节的数据存放在8个字节的buf里去,低4位在前,高4位在后,依次类推,存够8个byte。

在一些嵌入式的项目设计中,空间是相当宝贵的,因为一个CPU的存储是有限的,所以此时我们在保存数据的时候,喜欢来进行压缩保存,著名的有哈夫曼树算法,专门用来做压缩的算法,当然,本节我们不讨论这些稍微高级的算法,写一个简单的例子,开发中遇见的,比如,我想把0xfe,0xf1,0x3e,0x3c这四个字节的数据存放在8个字节的buf里去,低4位在前,高4位在后,依次类推,存够8个byte。这时第一反应就是采用数组来进行设计这样的一个算法,如何设计?

假设,uchar tab[] = {0xfe , 0xf1 , 0x3e , 0x3c} ; uchar table[8] ; 我需要将tab的数据存放到table中去。

/*
	table[0] = tab[0] & 0x0f ;  //取低位 
	table[1] = tab[0] & 0xf0 ; //取高位
	table[2] = tab[1] & 0x0f ;  //取低位 
	table[3] = tab[1] & 0xf0 ;	//取高位
	...
	table[6] = tab[3] & 0x0f ;  //取低位 
	table[7] = tab[3] & 0xf0 ;	//取高位

*/
由数据规律可以得知,当i为奇数时,取高位,为偶数时,取低位,并且,当为奇数时,取到tab的下一个buf里的值 。

我们可以用如下代码来实现,即可得到相应的把4个byte的数据存储到8个byte的数组里去.

#include <stdio.h>
unsigned char tab[4] = {0xfe,0xf1,0x3e,0x3c} ;
unsigned char table[8] ;
int main(void)
{
	int i ;
	int j ;
	int count = 0 ;
	for(i = 0 ; i < 8 ; i++)
	{
		if(i % 2 == 0)
			table[i] = tab[count] & 0x0f ;
		if(i % 2 != 0)
		{
			table[i] = tab[count] & 0xf0 ;
			count++ ;
		}
	}
	for(i = 0 ; i < 8 ; i++)
		printf("table[%d]:0x%x\n",i,table[i]) ;
}

运行结果:
table[0] : 0xe 
table[1] : 0xf0 
table[2] : 0x1
table[3] : 0xf0 
table[4] : 0xe
table[5] : 0x30 
table[6] : 0xc 
table[7] : 0x30 
如果这个过程反过来,需要将8个byte的数据存到4个byte里去呢?由此我们可以有下面的规律:

假设savebuf用来存储4个byte的数据:

/*
	savebuf[0] = table[0] | table[1] ;
	savebuf[1] = table[2] | table[3] ;
	savebuf[2] = table[4] | table[5] ; 
	savebuf[3] = table[6] | table[7] ;
*/
同样观察出规律,由以下代码实现:

#include <stdio.h>
unsigned char tab[4] = {0xfe,0xf1,0x3e,0x3c} ;
unsigned char table[8] ;
int savebuf[4] ;

int main(void)
{
	int i ;
	int j ;
	int low , high , count = 0 , beat_count ,value ;	
	count = 0 ; 
	beat_count = 0 ;
	for(j = 0 ; j < 8 ; j++)
	{
		if(j % 2 == 0)
			low = table[j] ;
		else 
		{
			high = table[j] ;
			count++ ;
			savebuf[beat_count] = low | high ;
			beat_count++;
		}
	}
	for(i = 0 ; i < 4 ; i++)
		printf("savebuf[%d]:%x\n",i , savebuf[i]) ;
} 

运行结果:
savebuf[0]:fe
savebuf[1]:f1
savebuf[2]:3e
savebuf[3]:3c








目录
相关文章
|
2月前
|
机器学习/深度学习 算法 前端开发
别再用均值填充了!MICE算法教你正确处理缺失数据
MICE是一种基于迭代链式方程的缺失值插补方法,通过构建后验分布并生成多个完整数据集,有效量化不确定性。相比简单填补,MICE利用变量间复杂关系,提升插补准确性,适用于多变量关联、缺失率高的场景。本文结合PMM与线性回归,详解其机制并对比效果,验证其在统计推断中的优势。
993 11
别再用均值填充了!MICE算法教你正确处理缺失数据
|
3月前
|
传感器 机器学习/深度学习 算法
【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)
【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)
258 1
|
4月前
|
机器学习/深度学习 Dragonfly 人工智能
基于蜻蜓算法优化支持向量机(DA-SVM)的数据多特征分类预测研究(Matlab代码实现)
基于蜻蜓算法优化支持向量机(DA-SVM)的数据多特征分类预测研究(Matlab代码实现)
119 0
|
3月前
|
机器学习/深度学习 算法 调度
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
365 0
|
5月前
|
传感器 机器学习/深度学习 分布式计算
卡尔曼滤波的多传感器数据融合算法
卡尔曼滤波的多传感器数据融合算法
752 0
|
7月前
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
167 2
|
2月前
|
机器学习/深度学习 人工智能 算法
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
142 0
|
3月前
|
存储 监控 算法
企业电脑监控系统中基于 Go 语言的跳表结构设备数据索引算法研究
本文介绍基于Go语言的跳表算法在企业电脑监控系统中的应用,通过多层索引结构将数据查询、插入、删除操作优化至O(log n),显著提升海量设备数据管理效率,解决传统链表查询延迟问题,实现高效设备状态定位与异常筛选。
131 3
|
8月前
|
数据采集 机器学习/深度学习 算法
别急着上算法,咱先把数据整明白:大数据分析的5个基本步骤,你都搞对了吗?
别急着上算法,咱先把数据整明白:大数据分析的5个基本步骤,你都搞对了吗?
501 4
|
3月前
|
算法 数据挖掘 定位技术
基于密度的聚类算法能够在含有噪声的数据集中识别出任意形状和大小的簇(Matlab代码实现)
基于密度的聚类算法能够在含有噪声的数据集中识别出任意形状和大小的簇(Matlab代码实现)
100 1