一種整數數據壓縮存儲的算法實現


對於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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM