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

在一些嵌入式的项目设计中,空间是相当宝贵的,因为一个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
时间: 2024-07-28 20:15:32

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

稀疏矩阵 压缩存储-将.off文件中的数据进行压缩存储,最好是做到与稀疏矩阵的压缩存储相关

问题描述 将.off文件中的数据进行压缩存储,最好是做到与稀疏矩阵的压缩存储相关 一个duck.off文件,327个点的坐标(x,y,z.double型数据),650个三角形连接信息.要求是把这些信息读入数组,并将这些数据进行压缩存储. 我想问的是:这些数据的压缩存储怎么样可以抽象成 稀 疏 矩 阵的压缩存储duck.off: OFF (文件格式为OFF) 327 650 0 (有327个顶点构成650个三角形) 539.697 -1035.28 317.708 (第一个顶点的xyz分量) ..

C语言中压缩字符串的简单算法小结_C 语言

应用中,经常需要将字符串压缩成一个整数,即字符串散列.比如下面这些问题: (1)搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节.请找出最热门的10个检索串. (2)有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M.返回频数最高的100个词. (3)有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复.要求你按照query的频度排序. (4)给定a.b两个文件

mcu-请教jpeglib库在压缩存储jpeg图片的详细过程

问题描述 请教jpeglib库在压缩存储jpeg图片的详细过程 jpeg库在压缩存储rgb数据时,是以压缩后的MCU为单位存储,还是以压缩后的一行rgb数据为单位存储? jpeg在压缩图片时不是以8x8的像素块(MCU也可能不是8x8)来编码的么,为什么它提供的 jpeg_write_scanlines()函数给人的感觉是压缩一行像素图,再把压缩后的数据存入文件中而不是存储一个压缩后的MCU.

高阶魔方与数据编排 - 数据库存储优化之路

标签 PostgreSQL , cluster , 预排 , 一维数据 , 多维数据 , 视觉编排 , 数据编排 , IO优化 背景 中华文化源远流长,比如这句古语"远水不救近火,远亲不如近邻",在数据库的优化中亦有体现.接下来我们来揭示这个道理. 大多数数据库的存储为块存储,一个块里面可能涉及到多条记录,当用户输入查询条件进行数据检索时,即使返回的结果集较小,也可能需要扫描多个数据块,因为你不知道你要的记录落在哪些数据块里面. 例子 随机写入一批数据 create table tbl

Swift使用gzip压缩NSData数据(附:请求时将JSON数据进行压缩)

GZIP 是为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式.使用 GZIP 一来可以减少存储空间,二来通过网络传输文件时,可以减少传输的时间. 大流量的WEB站点常常使用GZIP压缩技术,将网页内容压缩后传输到来访的电脑浏览器中显示出来(一般对纯文本内容可压缩到原大小的40%),大大提高了传输速度. 在iOS开发中,我们客户端也是可以利用 GZIP 来进行数据压缩的,比如网络请求时,将数据量比较大的参数进行压缩再传输,可以节约流量,提高速度. 一,使用gzip压缩NSD

如何为大数据部署下一代存储基础设施

与管理传统的大型数据基础设施相比,管理与大数据相关的拍字节级数据存储是一种全新的方式.目前在线照片分享网站Shutterfly管理着30拍字节的数据.Shutterfly在这里与我们分享了他们驯服"数据野兽"的经验. 目前,每个人都在谈论大数据分析方法和相关的商务智能成果.但是在公司能够利用这些数据前,他们必须想办法解决存储问题.管理拍字节级甚至更大规模的数据存储与管理传统大型数据集有着本质的区别. Shutterfly为一家在线照片分享网站.他们并不限制用户存储照片的数量,并且允许用

戴尔推出针对数据密集型工作负载存储方案

    戴尔近日宣布推出新的存储解决方案和扩展的最新功能,旨在帮助企业提高IT性能.支持数据洞察并降低总体成本.   由于数据大规模增长,很多企业转而采用针对性能和数据密集型工作负载优化的IT系统,例如需要分析客户和业务数据以获得有助于实现企业目标的深入见解.事实上, IDC预测,预计到2016年,全球大数据技术和服务市场的年复合增长率将达到31.7%,年收入将达到238亿美元.针对大数据部署的基础架构技术预计增长最快,存储市场的增长速度预计将达到最高的53.4% .   戴尔优化可扩展的存储平

数据结构实践——压缩存储的对称矩阵的运算

本文针对数据结构基础系列网络课程(5):数组与广义表的实践项目. [项目 - 压缩存储的对称矩阵的运算] 设计算法,实现两个用压缩形式存储的对称矩阵A和B的加法和乘法.实现中请使用好前面设计的基本运算. [参考解答] #include <stdio.h> #define N 4 #define M 10 int value(int a[],int i,int j) { if (i>=j) return a[(i*(i+1))/2+j]; else return a[(j*(j+1))/2

数据结构例程——对称矩阵的压缩存储及基本运算

本文针对数据结构基础系列网络课程(5):数组与广义表中第2课时特殊矩阵的压缩存储. 问题:用压缩形式存储对称矩阵,实现下面的操作并测试 void Init(int *&b);//为N阶对称矩阵初始化存储数据的一维数组b int Value(int b[], int i, int j);//返回存储在b[M]中,对应二维数组A[i][j]的值 void Assign(int b[], int e, int i, int j);//将e赋值给对应二维数组元素A[i][j],要存储到b[M]中 voi