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