我是靠谱客的博主 高贵水壶,最近开发中收集的这篇文章主要介绍一种整数数据压缩存储的算法实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

对于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.

 

typedef struct TRANS_S TRANS_T;
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个字节表示,但对于绝大部分的数据都可以进行压缩存储,对于存在大量数据的存储的应用可以有效的节省存储空间。

转载请注明原始出处:http://www.cnblogs.com/chencheng/archive/2012/07/01/2572251.html

转载于:https://www.cnblogs.com/chencheng/archive/2012/07/01/2572251.html

最后

以上就是高贵水壶为你收集整理的一种整数数据压缩存储的算法实现的全部内容,希望文章能够帮你解决一种整数数据压缩存储的算法实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部