序列化資料傳輸壓縮

吾非善類發表於2020-12-04

1.名詞解釋

1.1序列化

序列化的資料傳輸時以一定格式傳輸

例:

struct data{
    int64 data1;
    int64 data2;
    char data3[25];
}

但傳輸的資料實際上data1和data2大部分資料都是非常小的,只有極少數的資料會用到64位資料來進行儲存,這種時候本部落格的傳輸壓縮演算法就有用武之地。

1.2 1248碼:

在表示十進位制數時計算機除了二進位制編碼之外還有一種編碼方式叫做1248碼,其用4位二進位制數表示一位10進位制數。使用的地方例如高考的答題卡的塗寫中。

舉個例子

十進位制數255

對應的1248碼的二進位制的16進製表示就為:

0x0255

對應的機器二進位制碼的表示方法就為:

0xff

2.本演算法的思路:

將大量的不需要用1248編碼的資料放在序列化的資料的頭地址,將需要1248碼編碼的資料放在後半部分。利用1248碼所不能表示的10,11,12,13,14,15將資料分割,從而使資料變長去掉資料中大量不必要的0.

3.壓縮演算法:

雖然二進位制的序列化的資料儲存所需要的位數相對少一點,但是在序列化的時候,已經規定了資料所需的位數為64位。所以不論資料大小傳輸的時候都使用了64位來進行傳輸。大大的耗費了網路資源

壓縮演算法即先將資料轉化為BCD編碼後,在每一個資料的結尾利用1248碼所不能表示的10,11,12,13,14,15來進行分割資料。

拿開始定義的data結構體來說事:

例如傳輸這麼一個資料

data* a=(data*)malloc(sizeof(data));
data->data1=255;
data->data2=255;
data->data3="djwadja"

其所需傳輸的位數為64+64+25位。

而壓縮演算法傳輸的資料則為:

char[25]+0x255f255f

其傳輸的位數為25+64位。這樣就可以大大減少0所佔的位數。

4.使用此壓縮演算法的界線

對於64位的1248碼所能表示的最大數為10^16,但因為其中有4位的分割符,所以所能表示的最大數為10^15

即當結構體中的某一個屬性值有大量超過了10^15的數時,則此屬性建議放入序列化中,不使用此壓縮演算法。

相關文章