leb128(little endian base 128)是一種變長的整數壓縮編碼形式,它是出自於dwarf debug file format。在android的dalvik executable format中使用該編碼用於表示32位整數。由於32位整數占用固定的4個位元組,可能大多數整數並不需要4個位元組,最高幾個位元組可能為0(正數)或者為1(負數),該編碼就是不儲存最高位的這些位元組。
leb128的表現形式都是一樣的,如下面**所示,由於是little endian,因此是從低位元組到高位元組。每個位元組中的最高bit是標識資訊,1表示還有後續位元組,0表示結束,後面7bits是有效資料。將多個位元組的該7bits從低到高組合起來就是所表示的整數。
leb128分成有符號數和無符號數兩種分別進行處理,不過,只是在編碼和解碼過程有些不同。
低位址+1
+2+3
+40 ******x
1 ******x
0 ******x
1 ******x
1 ******x
0 ******x
1 ******x
1 ******x
1 ******x
0 ******x
1 ******x
1 ******x
1 ******x
1 ******x
0 ******x
將無符號整數寫成二進位制形式,從低位到高位7個bits為乙個整體組合成乙個位元組,在該位元組最高位填入上述所說的標識資訊。
下面以10000為例,編碼過程:
二進位制形式為
10 0111 0001 0000
以7bits為整體
1001110 0010000
新增標識組合成新的位元組(從後往前,即低bits到高bits)
01001110(0x4e) 10010000(0x90) (最高位標識設定為0,表示沒有後續位元組)
leb128 則為
0x90 0x4f (小端存放)
解碼過程:
leb128
0x90 0x4e
二進位制形式
10010000 01001110
去掉標識資訊
0010000(低7bits) 1001110(高7bits)
組合的結果為
10011100010000 (10000)
編碼**為:
void encodeuleb128(unsigned int
value, unsigned char *leb128_buffer)
if (pos > 0)
leb128_buffer[pos-1] &= 0x7f; //將最後乙個位元組的標識資訊設為0
}
解碼**為:void decodeuleb128(unsigned char *leb128_buffer, unsigned int
*value)
}
有符號數分成了正數和負數,在計算機的儲存中都是以補碼儲存,正數和上述無符號數一樣的處理,負數的處理會有些區別,以-10000為例說明,
編碼過程:
二進位制補碼
11111111 11111111 11111100 00011000(可以看出最高兩位元組都是符號擴充套件的1)
以7bits為整體
1111 1111111 1111111 1111000 0011000
新增標識資訊組合新的位元組(從後往前,即低bits到高bits)
01111000 10011000(此處結束條件不像上面那麼明顯,若前面和該7bits的最高位都為1時停止)
leb128則為
0x98 0x78
解碼過程:
leb128
0x98 0x78
二進位制形式
10011000 01111000
去掉標識資訊
0011000 1111000 (若最後乙個位元組中7bits的最高位為1,則前面需要符號擴充套件都新增1)
組合結果
11111111 11111111 1111100 00011000 (-10000)
編碼**為:
void encodeleb128(int
value, unsigned char *buffer)
}
編碼**為:void decodeleb128(unsigned char *buffer, int *value)
if (byte & 0x40)
*value |= -(1
<< offset);
}
leb128的理解難點是在有符號數上,編碼結束條件不像無符號數那麼明顯(value等於0),分兩種情況:
1. 若為正數,7bits中的最高位為0 並且 value == 0結束,value ==0 表示高位元組沒有資料,而7bits最高位為0用於表示是正數,用於解碼;
2. 若為負數,7bits中的最高位為1 並且 value == -1結束, value == -1表示高位元組都是符號擴充套件出來的1, 7bits最高位為1用於表示是負數,在解碼時高位填充1。
面試準備3 相關知識
1.對深度學習相關神經網路理解深入,如dnn cnn rnn gan等 2.有深厚的理論研究背景和資料基礎,熟悉em mcmc lr lda pca 時間序列等數學方法 3.熟悉一種以上的深度學習的開源框架,如caffe tensorflow arm ai library snpe等 dnn長短期記...
H264相關知識
1 基本概念 p frame 前向 編碼幀又稱predictive frame,通過充分將低於影象序列中前面已編碼幀的時間冗餘資訊來壓縮傳輸資料量的編碼影象,也叫 幀 b frame 雙向 內插編碼幀 又稱bi directional interpolated prediction frame,既考...
CSS3相關知識總結
moz代表firefox瀏覽器私有屬性 ms代表ie瀏覽器私有屬性 webkit代表safari chrome私有屬性 o代表歐朋 opera 核心識別碼 參考文章 布局的傳統解決方案,基於盒狀模型,依賴 display屬性 position屬性 float屬性。它對於那些特殊布局非常不方便,比如,...