Base 128 Varints 編碼(壓縮算法)


Base 128 Varint可以說是一種編碼方式,也可以說是一種壓縮算法。這種壓縮算法是用來壓縮數字的傳輸的,壓縮的依據是基於一個現實:越小的數字,越經常使用

我們來看看一個例子:

如果我們要網絡傳輸數字1,會怎樣傳輸呢?

假設我們用的是32位的整形傳輸,那么經過編碼,這個1的傳輸形式是:

00000000 00000000 00000000 00000001

然而,在這一堆要傳輸的數據里,幾乎所有的0都是無效數據(除了最后一個字節里,那些0沒辦法的無效填充),但是由於編碼的限制,又不得不把這堆0加上去。Base 128 Varints 編碼要解決的就是這個事情。那么,Base 128 Varint是如何編碼的呢?

(1)除了最后一個字節,varint中的每個字節的最高位設為1,表示后面還有字節出現

(2)每個字節的低7位看成是一個組(group),這個組和他相鄰的下一個7位組共同存儲某個整形的“組合表示”,最低有效組在前面。

很抽象,還是舉例子說明一下

(1)1個字節,假設數字是 0000 0001

則經過Base 128 Varint編碼后,還是原來的樣子 (0000 0001)

(2)2個字節,這次我們來個解碼,假設經過Base 128 Varint編碼后的01串是 1010 1100 0000 0010

根據定義,第1個字節的最高位是1,說明后面還是有數據。我們往后看,第2個字節的最高位是0,好,說明這個數編碼后是使用2字節的了。

取第1個字節的低7位,為:0101100

取第2個字節的低7位,為:0000010

我們再來看這句:最低有效組在前面

然后倒過來組合起來,即為原01串:

0000010 0101100(即十進制的300)

PS:這里的倒裝方式涉及到編碼方式的大小端

(3)3個字節,我們來看看怎么對 0110 1011 0110 0011進行編碼

a.從低位到高位,取7位為一個組(不足7位前面補0),這里為

1100011

1010110

0000001

b.反轉組裝 1100011 1010110 0000001

c.除了在最后一個字節補0,其他字節補1,即為:11100011 11010110 00000001

(4)更多字節

聰明的你應該已經發現了,用Base 128 Varint編碼的最大表示數為2^28,非常正確,同時說明了,天下沒有免費的午餐,有得必有失。但是,大家還記得前面說的那句話嗎:壓縮的依據是基於一個現實:越小的數字,越經常使用 , 所以,這個壓縮算法,是滿足絕大部分情況的。當然,如果傳輸的數字都是比較大的特殊情況,就不推薦這種算法了

 

PS:如何確認一個數字經過Base 128 Varint要用多少字節的傳輸或存儲:

1個字節的Base 128 Varint編碼后,有7位可以存儲,即可以傳輸數字為 0-2的7次方

以此類推:2個字節是2的14次方,3個字節為2的21次方

 

 

 


免責聲明!

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



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