c语言压缩存储,数据的压缩存储与解压缩算法实现(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
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
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语言)相关推荐
- 华为手表开发:WATCH 3 Pro(11)存储数据_轻量级存储_到本地
华为手表开发:WATCH 3 Pro(11)存储数据_轻量级存储_到本地 初 环境与设备 文件夹: 文件 开发步骤 新增一个文本输入框 index.hml index.css 存储数据的逻辑 inde ...
- 【Android 内存优化】Android 工程中使用 libjpeg-turbo 压缩图片 ( 初始化压缩对象 | 打开文件 | 设置压缩参数 | 写入压缩图像数据 | 完成压缩 | 释放资源 )
文章目录 一.使用 libjpeg-turbo 压缩图片流程 二.初始化 JPEG 压缩对象 三.打开文件 四.设置压缩参数 五.开始压缩 六.循环写入压缩数据 七.完成图片压缩及收尾 八.libjp ...
- 在c语言程序中将数据分为两种,2012年计算机二级C语言考点归纳汇总(一至四章)...
第1章程序设计基本概念考点归纳 1.1 C语言的特点 C语言是近年来非常流行的语言,很多人宁愿放弃已经熟悉的其他语言而改用C语言,其原因是C语言有优于其他语言的一系列特点.下面是C语言的主要特点: ( ...
- 数据的压缩存储与解压缩算法实现(C语言)
在一些嵌入式的项目设计中,空间是相当宝贵的,因为一个CPU的存储是有限的,所以此时我们在保存数据的时候,喜欢来进行压缩保存,著名的有哈夫曼树算法,专门用来做压缩的算法,当然,本节我们不讨论这些稍微高级 ...
- 「C语言进阶」数据内存的存储
- 蒙特卡洛 c语言,从伪随机数的产生到高大上的蒙特卡洛算法(C语言实现)
一 准备 1 生成任意区间任意大小的伪随机数 2 什么是蒙特卡洛算法 二蒙特卡洛算法的实现 1 pi的蒙特卡洛计算方式 2 特殊图形的蒙特卡洛计算方式 通过这篇短文想说明两个道理: 看似高大上.神秘兮 ...
- c语言程序排序的原理,几种常见排序算法原理C语言实现
使用WatiN进行UI自动化测试 Watin是一个UI自动化测试工具,支持ie/firefox,官方网站:http://watin.org/. 主要有以下特点: 支持主要的html元素,见:http: ...
- c语言求a b 最大公约数和最小公倍数,常见算法:C语言求最小公倍数和最大公约数三种算法...
最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,当中一个最小的公倍数是他们的最小公倍数,相同地,若干个整数公有的倍数中最小的正整数称为它们的最小公倍数,维基百科:定义点击打开链接 求 ...
- Android教程 -09 数据的持久化存储
视频为本篇播客知识点讲解,建议采用超清模式观看, 欢迎点击订阅我的优酷 任何一个程序其实说白了就是在不停地和数据打交道,数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证及时手机关机的情况下 ...
最新文章
- 虚拟文件系统(VFS)
- 计算机网络基础与信息安全,大学计算机基础计算机网络基础与信息安全计算机网络概述教案.doc...
- php add 返回id,PHP curl_multi_close函数
- SAP 3D visual enterprise viewer 9.0 的下载方式
- 【物理总结】初中物理重要常数、单位换算、概念、规律和理论及知识的应用归纳大全梳理总结...
- PL/SQL -- DML 触发器
- sklearn.model_selection中train_test_split的坑
- git git 查看远程库_如何从Git远程存储库中提取
- 谷歌等质问IETF:IPv6的用户在哪里?
- 今天发现的好几个PP文字,不敢独享,gaga
- [120_移动开发Android]012_android开发之动画播放
- JAVA 生成API接口文档
- 计算机毕业设计的代码会查重吗,一般毕业论文会查重代码吗?
- 传统方式不同的变态下载(BT)
- python shell怎么调字体大小_如何更改在Python Shell字体大小
- VMware系列序列号
- Java Web程序设计——JSP技术(一)
- Win10运行红色警戒2尤里的复仇联机技巧+防守地图
- java bitmap api,RoaringBitmap的使用
- r5 5500u和r5 4600u区别有多大 r55500u和r54600u哪个好
热门文章
- python中turtle画雪花_turtle画雪花-方法及效果的详解
- 精确度,召回率,真阳性,假阳性
- 计算机专业专科可以进的国企,专科毕业想要进国企?这四大专业是首选,成功率高达50%...
- 2022.5.4.学习笔记数据类型
- 让用户做主 为IBM再造存储铺路?
- 像素级分层语义图像分割
- 今日头条新闻采集爬虫分享
- 开源项目-CRM客户关系管理系统
- 按降序显示奇数python_程序在Python中分别以升序和降序对所有偶数和奇数进行排序...
- docker命令讲解