数据的压缩存储与解压缩算法实现(C语言)
2016-07-26 14:55
435 查看
在一些嵌入式的项目设计中,空间是相当宝贵的,因为一个CPU的存储是有限的,所以此时我们在保存数据的时候,喜欢来进行压缩保存,著名的有哈夫曼树算法,专门用来做压缩的算法,当然,本节我们不讨论这些稍微高级的算法,写一个简单的例子,开发中遇见的,比如,我想把0xfe,0xf1,0x3e,0x3c这四个字节的数据存放在8个字节的buf里去,低4位在前,高4位在后,依次类推,存够8个byte。这时第一反应就是采用数组来进行设计这样的一个算法,如何设计?
假设,uchar tab[] = {0xfe , 0xf1 , 0x3e , 0x3c} ; uchar table[8] ; 我需要将tab的数据存放到table中去。
我们可以用如下代码来实现,即可得到相应的把4个byte的数据存储到8个byte的数组里去.
如果这个过程反过来,需要将8个byte的数据存到4个byte里去呢?由此我们可以有下面的规律:假设savebuf用来存储4个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++虚函数表分析
- C/C++中的预编译指令
- C++指针详解(复习一下)
- codeforces 495B - Modular Equations
- 编译预处理
- codeforces - 495A Digital Counter
- java socket解析和发送二进制报文工具(附java和C++转化问题)
- c++ primer学习(三)表达式
- SIFT算法C语言逐步实现详解(上)
- 371. Sum of Two Integers
- c++ 子程序声明
- C语言单链表实现11个功能完全详解
- C++线程 消息队列
- C++关于模板
- vs c++配置opencv(1)
- c语言socket编程(基础)
- C语言正序输出输出一个整数的每一位
- C语言找一组数中单独出现的数字
- C语言斐波那契数列的多种实现
- 【C/C++】位运算之找出独苗