一种整数数据压缩存储的算法实现
来源:互联网 发布:图书馆软件知乎 编辑:程序博客网 时间:2024/05/16 09:24
转载自:http://www.cnblogs.com/chencheng/archive/2012/07/01/2572251.html
对于32位的机器,INT整形占四个字节,这意味着如果我们要保存一个INT类型数据需要占用4个字节空间,但实际的情况是4个字节的空间中并非所有的空间都保存了有效的数据位,比如整数1,在内存中以0x00000001表示,实际只有最低位表示了实际数据,通过实现一个整形的压缩算法可以有效的减少存储空间的使用。
1:在一个字节数据中只保存7bit有效数据,第8位作为一个INT数据是否表示完成的指示位(1表示未完成,0表示已经完成)。
2:通过判断字节的最高BIT位是否为0来获取一个INT型数据,这样我们可以通过1-5个字节数据来表示一个INT型。
3:数据转换通过去除每个字节的指示位,其它bit数据拼接构成INT数据。
一个例子:0x81 存在8个有效的数据位,由于算法中1个字节表示7BIT数据,我们只需要2个字节来表示该数据,转换后的数据表示为:1000 0001 0000 0001,第一个字节最高位为1,第二个字节最高位为0,表明存在2个字节表示该INT型,去除数据指示位,获取到数据000 0001 000 0001,转换为0X81.
struct TRANS_S{ int len; unsigned char buff[0];};int getTransLen(unsigned int value){ if(0 <= value && value<= 0x7F) { return 1; } if(0x80 <= value && value <= 0x3FFF) { return 2; } if(0x4000 <= value && value <= 0x1FFFFF) { return 3; } if(0x200000 <= value && value<= 0x0FFFFFFF) { return 4; } return 5;}void intTrans(unsigned int value, TRANS_T** ppBuff){ int len = -1; int temp = 0; TRANS_T* pBuff = NULL; len = getTransLen(value); pBuff = (TRANS_T*)malloc(sizeof(TRANS_T) + len); pBuff->len = len; temp = value; for (int i=0;i<len;i++) { pBuff->buff[i] = temp&0x7F; pBuff->buff[i] |= 0x80; temp >>= 7; } pBuff->buff[0] &= 0x7F; *ppBuff = pBuff; return;}
通过使用数据压缩算法,我们对于很少的一部分大整数需要5个字节表示,但对于绝大部分的数据都可以进行压缩存储,对于存在大量数据的存储的应用可以有效的节省存储空间。
0 0
- 一种整数数据压缩存储的算法实现
- 一种整数数据压缩存储的算法实现
- 列存储中常用的数据压缩算法
- LZO致力于解压速度的一种数据压缩算法
- LZO致力于解压速度的一种数据压缩算法
- 数据压缩算法实现
- 数据压缩算法:旋转门算法(SDT)的C#实现
- brew数据压缩的实现
- (转)GPS定位数据压缩算法的设计与实现
- java实现数据压缩的哈夫曼(Huffman)算法
- 大整数乘法的一种实现~~~
- 整数转字符串的一种快速实现
- 整数转字符串的一种快速实现
- 关于简单数据压缩的算法
- 无损数据压缩算法的历史
- 基于哈夫曼树的数据压缩算法
- 【数据压缩】LZ78算法原理及实现
- 数据压缩算法
- Alice and Bob
- Intent跳转到系统应用中的拨号界面、联系人界面、短信界面及其他
- mtk系统定制注意事项—
- MOno C# 开发自动更新的时候出现签名冲突 的问题
- 最近常用的sql语句
- 一种整数数据压缩存储的算法实现
- cocos2d-x 移植到android中编译的一些问题:fatal error: Box2D/Box2D.h: No such file or directory"
- C++/C课程设计(1)课题要求文档
- .net的验证码
- magento 中 直接写sql语句
- vc 2005运行时的问题导致在客户机上不能运行
- Happy Number
- 关于JavaScript中toSource问题的小结
- c++初识类