在一些嵌入式的项目设计中,空间是相当宝贵的,因为一个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

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

  1. 利用JAVA API函数实现数据的压缩与解压缩

      综述 许多信息资料都或多或少的包含一些多余的数据.通常会导致在客户端与服务器之间,应用程序与计算机之间极大的数据传输量.最常见的解决数据存储和信息传送的方法是安装额外的存储设备和扩展现有的通讯能力 ...

  2. hive 压缩全解读(hive表存储格式以及外部表直接加载压缩格式数据);HADOOP存储数据压缩方案对比(LZO,gz,ORC)

    数据做压缩和解压缩会增加CPU的开销,但可以最大程度的减少文件所需的磁盘空间和网络I/O的开销,所以最好对那些I/O密集型的作业使用数据压缩,cpu密集型,使用压缩反而会降低性能. 而hive中间结果 ...

  3. C++ 特殊矩阵的压缩存储算法

    1. 前言 什么是特殊矩阵? C++,一般使用二维数组存储矩阵数据. 在实际存储时,会发现矩阵中有许多值相同的数据或有许多零数据,且分布呈现出一定的规律,称这类型的矩阵为特殊矩阵. 为了节省存储空间, ...

  4. Hive(八)Hive的Shell操作与压缩存储

    一.Hive的命令行 1.Hive支持的一些命令 Command Description quit Use quit or exit to leave the interactive shell. s ...

  5. 三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述)

    三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述) 用经典矩阵转置算法和普通的三元组矩阵转置在时间复杂度上都是不乐观的.快速转置算法在增加适当存储空间后实现快速转置具体原理见代码注释部 ...

  6. InnoDB 数据表压缩原理与限制

    http://liuxin1982.blog.chinaunix.net/uid-24485075-id-3523032.html 压缩理念 通过提高CPU利用率和节约成本,降低数据库容量及I/O负载 ...

  7. CCF 第六次计算机职业认证 第四题 收货 stl动态存储和fleury算法的综合应用

    问题描述 为了增加公司收入,F公司新开设了物流业务.由于F公司在业界的良好口碑,物流业务一开通即受到了消费者的欢迎,物流业务马上遍及了城市的每条街道.然而,F公司现在只安排了小明一个人负责所有街道的服 ...

  8. python实现数据的压缩与归档

    楔子 尽管现代计算机系统的存储能力日益增长,但生成数据的增长是永无休止的. 无损(lossless)压缩算法以压缩或解压缩数据花费的时间来换取存储数据所需要的空间,以弥补存储能力的不足. Python ...

  9. 2018-8-10-C#-配置文件存储-各种序列化算法性能比较

    title author date CreateTime categories C# 配置文件存储 各种序列化算法性能比较 lindexi 2018-08-10 19:16:52 +0800 2018 ...

随机推荐

  1. POJ 放苹果问题(递归)

    首先我们想象有一个函数count  f(m,n)可以把m个苹果放到n个盘子中. 根据 n 和 m 的关系可以进一步分析: 特殊的m <=1|| n <= 1时只有一种方法: 当 m < ...

  2. JavaScript 代码规范

    所有的 JavaScript 项目适用同一种规范. JavaScript 代码规范 代码规范通常包括以下几个方面: 变量和函数的命名规则 空格,缩进,注释的使用规则. 其他常用规范-- 规范的代码可以 ...

  3. Template基础

    模板系统的介绍 你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. def current_datetime(request): now ...

  4. android Git命令家底儿及Git数据通信原理详解

    声明:本文为CSDN原创投稿文章,未经许可,禁止任何形式的转载. 现在大部分使用的都是SVN,也有一部分迁移了Git,虽然挺好的,不过还有其它很多版本控制的工具,并没有谁最好用,最重要的是适合自己的公 ...

  5. Dubbo框架应用之(二)--服务治理

    Dubbo服务治理全貌图 当我们现有ITOO平台系统的业务随着用户的逐渐增大,设计的业务越来越广,系统会异常的复杂,在大规模服务之前,我们可以采用的是RMI或Hessian等工具,暴露和引用远程服务, ...

  6. Programming In Scala笔记-第十六章、Scala中的List

    本章主要分析Scala中List的用法,List上可进行的操作,以及需要注意的地方. 一.List字面量 首先看几个List的示例. val fruit = List("apples&quo ...

  7. 针对于Python的OpenCV环境搭建

    OpenCV 依赖 下载OpenCV 配置 总结 给Python搭建opencv的环境还真是略嫌麻烦,于是做下笔记,以备不时之需. OpenCV 依赖 opencv有些依赖,我们必须安装一下,否则接下 ...

  8. ROS_Kinetic_28 turtlebot gazebo demo例子

    ROS_Kinetic_28 turtlebot gazebo demo例子 官方教程:http://wiki.ros.org/turtlebot_gazebo/Tutorials/indigo/Ma ...

  9. Hive-RCFile文件存储格式

    在新建Hive表时,可以使用stored as rcfile来指定hive文件的存储方式为RCFile. 一.RCFile文件结构 下图是一个RCFile的文件结构形式. 从上图可以看出: 1)一张表 ...

  10. 【一天一道LeetCode】#169. Majority Element

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...