文件头(File Header)
Dex文件头主要包括校验和以及其他结构的偏移地址和长度信息。
字段名称 | 偏移值 | 长度 | 描述 |
---|---|---|---|
magic | 0x0 | 8 | 'Magic'值,即魔数字段,格式如”dex/n035/0”,其中的035表示结构的版本。 |
checksum | 0x8 | 4 | 校验码。 |
signature | 0xC | 20 | SHA-1签名。 |
file_size | 0x20 | 4 | Dex文件的总长度。 |
header_size | 0x24 | 4 | 文件头长度,009版本=0x5C,035版本=0x70。 |
endian_tag | 0x28 | 4 | 标识字节顺序的常量,根据这个常量可以判断文件是否交换了字节顺序,缺省情况下=0x78563412。 |
link_size | 0x2C | 4 | 连接段的大小,如果为0就表示是静态连接。 |
link_off | 0x30 | 4 | 连接段的开始位置,从本文件头开始算起。如果连接段的大小为0,这里也是0。 |
map_off | 0x34 | 4 | map数据基地址。 |
string_ids_size | 0x38 | 4 | 字符串列表的字符串个数。 |
string_ids_off | 0x3C | 4 | 字符串列表表基地址。 |
type_ids_size | 0x40 | 4 | 类型列表里类型个数。 |
type_ids_off | 0x44 | 4 | 类型列表基地址。 |
proto_ids_size | 0x48 | 4 | 原型列表里原型个数。 |
proto_ids_off | 0x4C | 4 | 原型列表基地址。 |
field_ids_size | 0x50 | 4 | 字段列表里字段个数。 |
field_ids_off | 0x54 | 4 | 字段列表基地址。 |
method_ids_size | 0x58 | 4 | 方法列表里方法个数。 |
method_ids_off | 0x5C | 4 | 方法列表基地址。 |
class_defs_size | 0x60 | 4 | 类定义类表中类的个数。 |
class_defs_off | 0x64 | 4 | 类定义列表基地址。 |
data_size | 0x68 | 4 | 数据段的大小,必须以4字节对齐。 |
data_off | 0x6C | 4 | 数据段基地址 |
魔数字段
SHA-1签名字段
map_off字段
这个字段主要保存map开始位置,就是从文件头开始到map数据的长度,通过这个索引就可以找到map数据。map的数据结构如下:
名称 | 大小 | 说明 |
---|---|---|
size | 4字节 | map里项的个数 |
list | 变长 | 每一项定义为12字节,项的个数由上面项大小决定。 |
map数据排列结构定义如下:
<wbr> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">typedef</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">struct</span> DexMapList <span style="word-wrap: normal; word-break: normal; line-height: 20px;">{</span> u4 size<span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span> DexMapItem list<span style="word-wrap: normal; word-break: normal; line-height: 20px;">[</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">1</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">]</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">}</span>DexMapList<span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span> </wbr>
每一个map项的结构定义如下:
<wbr> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">typedef</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">struct</span> DexMapItem <span style="word-wrap: normal; word-break: normal; line-height: 20px;">{</span> u2 type<span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span> u2 unused<span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span> u4 size<span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span> u4 offset<span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">}</span>DexMapItem<span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span> </wbr>
DexMapItem结构定义每一项的数据意义:类型、类型个数、类型开始位置。
其中的类型定义如下:
<span style="word-wrap: normal; word-break: normal; line-height: 20px;">enum</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">{</span> kDexTypeHeaderItem <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">0x0000</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">,</span> kDexTypeStringIdItem <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">0x0001</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">,</span> kDexTypeTypeIdItem <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">0x0002</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">,</span> kDexTypeProtoIdItem <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">0x0003</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">,</span> kDexTypeFieldIdItem <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">0x0004</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">,</span> kDexTypeMethodIdItem <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">0x0005</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">,</span> kDexTypeClassDefItem <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">0x0006</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">,</span> kDexTypeMapList <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">0x1000</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">,</span> kDexTypeTypeList <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">0x1001</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">,</span> kDexTypeAnnotationSetRef<wbr>List <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">0x1002</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">,</span> kDexTypeAnnotationSetIte<wbr>m <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">0x1003</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">,</span> kDexTypeClassDataItem <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">0x2000</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">,</span> kDexTypeCodeItem <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">0x2001</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">,</span> kDexTypeStringDataItem <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">0x2002</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">,</span> kDexTypeDebugInfoItem <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">0x2003</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">,</span> kDexTypeAnnotationItem <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">0x2004</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">,</span> kDexTypeEncodedArrayItem<wbr> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">0x2005</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">,</span> kDexTypeAnnotationsDirec<wbr>toryItem <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">0x2006</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">,</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">}</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span> </wbr></wbr></wbr></wbr>
从上面的类型可知,它包括了在dex文件里可能出现的所有类型。可以看出这里的类型与文件头里定义的类型有很多是一样的,这里的类型其实就是文件头里定义 的类型。其实这个map的数据,就是头里类型的重复,完全是为了检验作用而存在的。当Android系统加载dex文件时,如果比较文件头类型个数与 map里类型不一致时,就会停止使用这个dex文件
string_ids_size/off字段
这两个字段主要用来标识字符串资源。源程序编译后,程序里用到的字符串都保存在这个数据段里,以便解释执行这个dex文件使用。其中包括调用库函数里的类名称描述,用于输出显示的字符串等。
string_ids_size标识了有多少个字符串,string_ids_off标识字符串数据区的开始位置。字符串的存储结构如下:
<span style="word-wrap: normal; word-break: normal; line-height: 20px;">typedef</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">struct</span> DexStringId <span style="word-wrap: normal; word-break: normal; line-height: 20px;">{</span> u4 stringDataOff<span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">}</span> DexStringId<span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span>
可以看出这个数据区保存的只是字符串表的地址索引。如果要找到字符串的实际数据,还需要通过个地址索引找到文件的相应开始位置,然后才能得到字符串数据。 每一个字符串项的索引占用4个字节,因此这个数据区的大小就为4*string_ids_size。实际数据区中的字符串采用UTF8格式保存。
例如,如果dex文件使用16进制显示出来内容如下:
063c 696e 6974 3e00
其实际数据则是”\0”
另外这段数据中不仅包括字符串的字符串的内容和结束标志,在最开头的位置还标明了字符串的长度。上例中第一个字节06就是表示这个字符串有6个字符。
关于字符串的长度有两点需要注意的地方:
1、关于长度的编码格式
dex文件里采用了变长方式表示字符串长度。一个字符串的长度可能是一个字节(小于256)或者4个字节(1G大小以上)。字符串的长度大多数都是小于 256个字节,因此需要使用一种编码,既可以表示一个字节的长度,也可以表示4个字节的长度,并且1个字节的长度占绝大多数。能满足这种表示的编码方式有 很多,但dex文件里采用的是uleb128方式。leb128编码是一种变长编码,每个字节采用7位来表达原来的数据,最高位用来表示是否有后继字节。
它的编码算法如下:
DEX_INLINE u1<span style="word-wrap: normal; word-break: normal; line-height: 20px;">*</span> writeUnsignedLeb128<span style="word-wrap: normal; word-break: normal; line-height: 20px;">(</span>u1<span style="word-wrap: normal; word-break: normal; line-height: 20px;">*</span> ptr<span style="word-wrap: normal; word-break: normal; line-height: 20px;">,</span> u4 data<span style="word-wrap: normal; word-break: normal; line-height: 20px;">)</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">{</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">while</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">(</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">true</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">)</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">{</span> u1 out <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> data <span style="word-wrap: normal; word-break: normal; line-height: 20px;">&</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">0x7f</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">if</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">(</span>out <span style="word-wrap: normal; word-break: normal; line-height: 20px;">!=</span> data<span style="word-wrap: normal; word-break: normal; line-height: 20px;">)</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">{</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">*</span>ptr<span style="word-wrap: normal; word-break: normal; line-height: 20px;">++</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> out <span style="word-wrap: normal; word-break: normal; line-height: 20px;">|</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">0x80</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span> data <span style="word-wrap: normal; word-break: normal; line-height: 20px;">>>=</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">7</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">}</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">else</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">{</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">*</span>ptr<span style="word-wrap: normal; word-break: normal; line-height: 20px;">++</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> out<span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">break</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">}</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">}</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">return</span> ptr<span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">}</span>
它的解码算法如下:
DEX_INLINE <span style="word-wrap: normal; word-break: normal; line-height: 20px;">int</span> readUnsignedLeb128<span style="word-wrap: normal; word-break: normal; line-height: 20px;">(</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">const</span> u1<span style="word-wrap: normal; word-break: normal; line-height: 20px;">**</span> pStream<span style="word-wrap: normal; word-break: normal; line-height: 20px;">)</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">{</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">const</span> u1<span style="word-wrap: normal; word-break: normal; line-height: 20px;">*</span> ptr <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">*</span>pStream<span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">int</span> result <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">*</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">(</span>ptr<span style="word-wrap: normal; word-break: normal; line-height: 20px;">++</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">)</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">if</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">(</span>result <span style="word-wrap: normal; word-break: normal; line-height: 20px;">></span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">0x7f</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">)</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">{</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">int</span> cur <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">*</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">(</span>ptr<span style="word-wrap: normal; word-break: normal; line-height: 20px;">++</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">)</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span> result <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">(</span>result <span style="word-wrap: normal; word-break: normal; line-height: 20px;">&</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">0x7f</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">)</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">|</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">(</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">(</span>cur <span style="word-wrap: normal; word-break: normal; line-height: 20px;">&</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">0x7f</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">)</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;"><<</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">7</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">)</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">if</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">(</span>cur <span style="word-wrap: normal; word-break: normal; line-height: 20px;">></span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">0x7f</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">)</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">{</span> cur <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">*</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">(</span>ptr<span style="word-wrap: normal; word-break: normal; line-height: 20px;">++</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">)</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span> result <span style="word-wrap: normal; word-break: normal; line-height: 20px;">|=</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">(</span>cur <span style="word-wrap: normal; word-break: normal; line-height: 20px;">&</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">0x7f</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">)</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;"><<</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">14</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">if</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">(</span>cur <span style="word-wrap: normal; word-break: normal; line-height: 20px;">></span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">0x7f</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">)</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">{</span> cur <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">*</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">(</span>ptr<span style="word-wrap: normal; word-break: normal; line-height: 20px;">++</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">)</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span> result <span style="word-wrap: normal; word-break: normal; line-height: 20px;">|=</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">(</span>cur <span style="word-wrap: normal; word-break: normal; line-height: 20px;">&</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">0x7f</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">)</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;"><<</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">21</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">if</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">(</span>cur <span style="word-wrap: normal; word-break: normal; line-height: 20px;">></span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">0x7f</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">)</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">{</span> cur <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">*</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">(</span>ptr<span style="word-wrap: normal; word-break: normal; line-height: 20px;">++</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">)</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span> result <span style="word-wrap: normal; word-break: normal; line-height: 20px;">|=</span> cur <span style="word-wrap: normal; word-break: normal; line-height: 20px;"><<</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">28</span><span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">}</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">}</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">}</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">}</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">*</span>pStream <span style="word-wrap: normal; word-break: normal; line-height: 20px;">=</span> ptr<span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">return</span> result<span style="word-wrap: normal; word-break: normal; line-height: 20px;">;</span> <span style="word-wrap: normal; word-break: normal; line-height: 20px;">}</span>
根据上面的算法分析上面例子字符串,取得第一个字节是06,最高位为0,因此没有后继字节,那么取出这个字节里7位有效数据,就是6,也就是说这个字符串是6个字节,但不包括结束字符“\0”。
2、关于长度的意义
由于字符串内容采用的是UTF-8格式编码,表示一个字符的字节数是不定的。即有时是一个字节表示一个字符,有时是两个、三个甚至四个字节表示一个字符。 而这里的长度代表的并不是整个字符串所占用的字节数,表示这个字符串包含的字符个数。所以在读取时需要注意,尤其是在包含中文字符时,往往会因为读取的长 度不正确导致字符串被截断。
转自: