一種整數(shù)數(shù)據(jù)壓縮存儲(chǔ)的算法實(shí)現(xiàn)對(duì)于32位的機(jī)器,INT整形占四個(gè)字節(jié),這意味著如果我們要保存一個(gè)INT類型數(shù)據(jù)需要占用4個(gè)字節(jié)空間,但實(shí)際的情況是4個(gè)字節(jié)的空間中并非所有的空間都保存了有效的數(shù)據(jù)位,比如整數(shù)1,在內(nèi)存中以0x00000001表示,實(shí)際只有最低位表示了實(shí)際數(shù)據(jù),通過實(shí)現(xiàn)一個(gè)整形的壓縮算法可以有效的減少存儲(chǔ)空間的使用。 1:在一個(gè)字節(jié)數(shù)據(jù)中只保存7bit有效數(shù)據(jù),第8位作為一個(gè)INT數(shù)據(jù)是否表示完成的指示位(1表示未完成,0表示已經(jīng)完成)。 2:通過判斷字節(jié)的最高BIT位是否為0來獲取一個(gè)INT型數(shù)據(jù),這樣我們可以通過1-5個(gè)字節(jié)數(shù)據(jù)來表示一個(gè)INT型。 3:數(shù)據(jù)轉(zhuǎn)換通過去除每個(gè)字節(jié)的指示位,其它bit數(shù)據(jù)拼接構(gòu)成INT數(shù)據(jù)。
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; } 通過使用數(shù)據(jù)壓縮算法,我們對(duì)于很少的一部分大整數(shù)需要5個(gè)字節(jié)表示,但對(duì)于絕大部分的數(shù)據(jù)都可以進(jìn)行壓縮存儲(chǔ),對(duì)于存在大量數(shù)據(jù)的存儲(chǔ)的應(yīng)用可以有效的節(jié)省存儲(chǔ)空間。 |
|