[转载]LEB128格式简介(CN)

LEB128即"Little-Endian Base 128",基于128的小印第安序编码格式,是对任意有符号或者无符号整型数的可变长度的编码。

也即,用LEB128编码的正数,会根据数字的大小改变所占字节数。在android的.dex文件中,他只用来编码32bits的整型数。

格式:

上图只是指示性的用两个字节表示。编码的每个字节有效部分只有低7bits,每个字节的最高bit用来指示是否是最后一个字节。
非最高字节的bit7为0
最高字节的bit7为1
将leb128编码的数字转换为可读数字的规则是:除去每个字节的bit7,将每个字节剩余的7个bits拼接在一起,即为数字。
比如:
LEB128编码的0x02b0 ---> 转换后的数字0x0130
转换过程:
0x02b0 ---> 0000 0010 1011 0000 -->去除最高位--> 000 0010 011 0000 -->按4bits重排 --> 00 0001 0011 0000 --> 0x130
转换函数为:
代码位于:android/dalvik/libdex/leb128.h

 1 /*
 2  * Reads an unsigned LEB128 value, updating the given pointer to point
 3  * just past the end of the read value. This function tolerates
 4  * non-zero high-order bits in the fifth encoded byte.
 5  */
 6 DEX_INLINE int readUnsignedLeb128(const u1** pStream) {
 7     const u1* ptr = *pStream;
 8     int result = *(ptr++);
 9
10     if (result > 0x7f) {
11         int cur = *(ptr++);
12         result = (result & 0x7f) | ((cur & 0x7f) << 7);
13         if (cur > 0x7f) {
14             cur = *(ptr++);
15             result |= (cur & 0x7f) << 14;
16             if (cur > 0x7f) {
17                 cur = *(ptr++);
18                 result |= (cur & 0x7f) << 21;
19                 if (cur > 0x7f) {
20                     /*
21                      * Note: We don't check to see if cur is out of
22                      * range here, meaning we tolerate garbage in the
23                      * high four-order bits.
24                      */
25                     cur = *(ptr++);
26                     result |= cur << 28;
27                 }
28             }
29         }
30     }
31
32     *pStream = ptr;
33     return result;
34 }
35
36 /*
37  * Reads a signed LEB128 value, updating the given pointer to point
38  * just past the end of the read value. This function tolerates
39  * non-zero high-order bits in the fifth encoded byte.
40  */
41 DEX_INLINE int readSignedLeb128(const u1** pStream) {
42     const u1* ptr = *pStream;
43     int result = *(ptr++);
44
45     if (result <= 0x7f) {
46         result = (result << 25) >> 25;
47     } else {
48         int cur = *(ptr++);
49         result = (result & 0x7f) | ((cur & 0x7f) << 7);
50         if (cur <= 0x7f) {
51             result = (result << 18) >> 18;
52         } else {
53             cur = *(ptr++);
54             result |= (cur & 0x7f) << 14;
55             if (cur <= 0x7f) {
56                 result = (result << 11) >> 11;
57             } else {
58                 cur = *(ptr++);
59                 result |= (cur & 0x7f) << 21;
60                 if (cur <= 0x7f) {
61                     result = (result << 4) >> 4;
62                 } else {
63                     /*
64                      * Note: We don't check to see if cur is out of
65                      * range here, meaning we tolerate garbage in the
66                      * high four-order bits.
67                      */
68                     cur = *(ptr++);
69                     result |= cur << 28;
70                 }
71             }
72         }
73     }
74
75     *pStream = ptr;
76     return result;
77 }

posted on 2013-07-30 00:42 chx4 阅读(...) 评论(...)  编辑 收藏

转载于:https://www.cnblogs.com/chx4/articles/3224212.html

[转载]LEB128格式简介(CN)相关推荐

  1. RGB与YUV格式简介

    (1) RGB格式简介 RGB色彩模式是一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的.图像中每一个像素的RGB分量都分配一个0~25 ...

  2. 详解Object.create(null)(转载自https://juejin.cn/post/6844903589815517192)

    ** (转载自https://juejin.cn/post/6844903589815517192) ** Object.create().{-}的区别 先看看我们经常使用的{}创建的对象是什么样子的 ...

  3. SDI视频数据流格式简介(频率、速率、YUV、EAV、SAV)

    文章目录 SDI视频格式简介 SDI视频流数据格式 示意图 SDI视频格式简介 ​ 常见的SDI视频格式主要包括SD-SDI.HD-SDI.3G-SDI三种,其比特率依次增加,也对应着不同分辨率和刷新 ...

  4. 音频格式简介和PCM转换成WAV

    1 音频格式简介 AudioRecord录制的音频文件格式为PCM,MediaPlayer无法播放PCM格式文件,AudioTrack可以播放PCM格式文件. PCM(Puls Code Modula ...

  5. http报文格式简介

    前端和后端的沟通其实和我们生活中人与人之间的沟通是一样的,也是一种通信,只不过是计算机之间的通信.人与人之间之所以能沟通是因为我们遵循了同一种规则(协议)--语言.通信的双方只有遵循一种共同的通信协议 ...

  6. Java JSON格式简介说明

    转自: Java JSON格式简介说明 下文笔者讲述java中JSON格式的相关简介说明,如下所示: JSON简介说明 JSON(JavaScript Object Notation) 是一种轻量级的 ...

  7. json格式简介和相关操作

    前言:在日常工作中,我们常常会使用json做一些数据的处理,那了解json的一些基础知识和相关操作就尤为重要,本篇就是对于json格式的概括介绍和简单使用. 1.json格式简介 1.1 json基本 ...

  8. 计算机视觉——bbox的格式简介

    计算机视觉--bbox的格式简介 一.Itwh 二.xywh 前提知识: 左上角为坐标原点 一.Itwh 全程:(left,top,weight,height) 二.xywh 全程:(x,y,weig ...

  9. 图形图像相关格式简介

    格式简介: 1.BMP:英文(Bitmap)Windows操作系统中的标准图像文件格式,本身是不压缩文件.BMP文件存储数据时,图像的扫描方式是按从左到右.从下到上的顺序.颜色深度位数可以是1bit. ...

最新文章

  1. Redis分布式锁 Spring Schedule实现任务调度
  2. 多线程顺序消费MySQL数据_关于MQ的几件小事(五)如何保证消息按顺序执行
  3. java中6左移2怎么算_(六)Java中的按位运算
  4. 【CyberSecurityLearning 65】业务安全+业务逻辑漏洞实战
  5. HDFS机架感知概念及配置实现
  6. STM32中的位带(bit-band)操作
  7. bzoj 4631: 踩气球(线段树)
  8. 曲线与曲面积分公式整理
  9. JS分割字符串——split()
  10. matlab信号分析与处理:时域分析
  11. 如何提高你的工作效率
  12. 矩阵论(四)——矩阵的广义逆
  13. Codeforces Round 701 Multiples and Power Differences
  14. 链家租房市场分析(R爬虫、数据可视化)
  15. ipad协议最新替代
  16. 做一个校园跑腿小程序需要多少成本?
  17. three.js网页demo展示
  18. 离职前一定要删除这几个文件,不然你的微信聊天记录全被别人看了
  19. 千锋教育+计算机四级网络-计算机网络学习-04
  20. POJ 3069 Saruman's Army(萨鲁曼军)

热门文章

  1. jsp+tomcat程序helloworld
  2. CoreMail/pku的邮箱如何禁止某个后缀的所有邮箱
  3. intellij导入scala工程不识别scala语言
  4. RHEL7恢复.bashrc文件
  5. 核密度估计Kernel Density Estimation(KDE)-代码详细解释
  6. 电商产品评论数据情感分析代码详解
  7. mysql看表关联视图_MySQL数据库 : 自关联,视图,事物,索引
  8. mysql注入攻击实_三十三、MySQL基础系列笔记之MySQL安全问题与SQL注入攻击
  9. 玩转JavaScript正则表达式
  10. ROS kinect:OpenNI读取深度图像与彩色图像