int32 uint32 整數壓縮與解壓縮演算法

2021-08-26 05:03:31 字數 2509 閱讀 4426

對網路包進行壓縮可以減少網路頻寬,提高傳輸效率, 很多時候一些報文中包含一些無符號整數,比如報文頭中的長度資訊.正常情況下乙個無符號整數占用32位

0x0000 0000 到 0xffff ffff .

由於乙個無符號整數始終佔據著4位元組記憶體,就算是1也會佔據著4個位元組,其實只要1位元組就可以儲存了.(要想壓縮整數,基本演算法思想是壓縮在4位元組之內也就是1,2,3,4.

把無符號整數進行邏輯分段:

0x00 ~ 0xff 0~255 1byte 0x100 ~ 0xffff 256~65535 2byte 0x10000 ~ 0xffffff 65536~16777215 3byte 0x1000000 ~ 0xffffffff 16777216~4294967295 4byt (無意義)

通過上面可以大致看出1~4位元組的邏輯分層.把無符號整數進行壓縮在乙個字元陣列內,定義乙個char buf[4];

當在0x00~0xff之間時:

因為是只有1個位元組只要儲存在buf[0] 這個字元內。

當在0x100~0xffff之間時:

這個範圍是2個位元組,把前8位儲存於陣列buf[0]內,後8位儲存於陣列buf[1]內 。通過位操作即可。

當在0x100~0xffffff之間時也類似。

當在0x1000000 ~ 0xffffffff這個範圍不進行壓縮。因為必須占用4個位元組,所以沒什麼意義。

下面看下壓縮**:

bool cb_compress(unsigned int data, char* buf, unsigned int& len) else if (data <= 0xffff) else if (data <= 0xffffff) else else if (2 == len) else if (1 == len) else //1 byte if (i == 0) else //0x80為掩碼 buf[len] = c; len++; } //invaild data if (!len) return true; }

如果檢查為1 表示後面7位需要和下面一段資料進行拼接,0表示後面7位為最後7位。 所以可能壓縮后位1~5位元組內。

解壓縮:

bool cb_uncompress(char *buf, int len, unsigned int &i) return true; }

python實現壓縮與解壓縮:( 本段程式,參考

def compress(self, data): if data <= 0x7f: bytes_1arr = (c_char * 1)() bytes_1arr = struct.pack("b", data); return bytes_1arr elif data <= 0x3fff: bytes_2arr = (c_char * 2)() bytes_2arr[0] = struct.pack("b", (data & 0xff00)>>8 | 0x80); bytes_2arr[1] = struct.pack("b", data & 0x00ff); return bytes_2arr elif data <= 0xffff: bytes_3arr = (c_char * 4)() bytes_3arr[0] = struct.pack("b", (data & 0xff000000)>>24 | 0xc0); bytes_3arr[1] = struct.pack("b", (data & 0x00ff0000)>>16); bytes_3arr[2] = struct.pack("b", (data & 0x0000ff00)>>8); bytes_3arr[3] = struct.pack("b", (data & 0x000000ff)); return bytes_3arr else: print "invaild data"

def uncompress(self, data): _len = len(data) if _len == 1: return struct.unpack("b", data[0]) elif _len == 2: _data0 = struct.unpack("b", data[0]) _data1 = struct.unpack("b", data[1]) return ((_data0[0] & 0x3f)<<8 | _data1[0]) & 0x00ff elif _len == 4: _data0 = struct.unpack("b", data[0])[0] _data1 = struct.unpack("b", data[1])[0] _data2 = struct.unpack("b", data[2])[0] _data3 = struct.unpack("b", data[3])[0] return ((_data0 & 0x1f)<<24 | _data1<<16 | _data2<<8 | _data3); else: print "uncompress error!"另外需要注意的是 python返回後的是個元祖 需要 用 .value來取值

圖示:-> 1000 0001 | 0000 0000

32位int整數範圍

計算機中32位int型別變數的範圍,其中int型別是帶符號整數。正數在計算機中表示為原碼,最高位是符號位 1的原碼為0000 0000 0000 0000 0000 0000 0000 0001 2147483647的原碼為0111 1111 1111 1111 1111 1111 1111 111...

資料型別 uint32 t 型別

整型的每一種都有無符號 unsigned 和有符號 signed 兩種型別 float和double總是帶符號的 在預設情況下宣告的整型變數都是有符號的型別 char有點特別 如果需宣告無符號型別的話就需要在型別前加上unsigned。無符號版本和有符號版本的區別就是無符號型別能儲存2倍於有符號型別...

資料型別 uint32 t 等型別

1 在寫程式時注意 無符號型別 的使用,各種型別邊界值的情況.如 a 當某個資料不可能為負數時我們一定要考慮用以下型別 unsigned char,unsigned int,uint32 t,size t,uint64 t,unsigned long int,b 當有些資料你不知道是正負時一定不要用...