.NET/CLI元数据中使用的压缩整数2011-09-30 博客园 Anders Liu简单来说,整数压缩算法就是将一个32位整数(通常占用4个字节)放置到尽可能少的存储空间中(1 、2或4个字节)的方法。整数压缩算法广泛地应用在.NET/CLI PE文件中,如各种元数据签名、 #Blob和#US流等。在这些地方,需要使用整数值来记录条目的数量或是数据块的大小等。如果单纯地采用 32位整数,由于绝大多数数量值或大小值都不大,会造成大量字节都被置为无意义的0值。在这些场景中 使用压缩算法,可以有效地节省PE文件占用的磁盘空间或网络带宽。以下是PE文件中一些使用到 压缩整数的场景:Blob堆(#Blob流和#US流所采用的存储格式)中的每个条目开始处,使用压缩 的无符号整数表示条目的大小;方法的元数据签名中,使用压缩的无符号整数存储参数的数量;元数据签名中的数组下标,采用压缩的带符号整数进行存储。注意,本文所介绍的压缩与 解压算法,都是针对32位整数的。此外,在本文的介绍中,如果没有特殊提及,则所出现的整数都按照大 尾数法表示(最高权重字节放在左侧或上方)。无符号整数的压缩与解压无符号整数的压缩算法无符号整数的压缩是比较简单的,即将无符号整数的整个取值范围划分为几个区段,而整数值根 据其所在的区段不同,放置在1、2或4个字节中。表1列出了无符号整数的区段划分和压缩方式。
区段 | 字节数 | 掩码 | 二进制形式 |
[00000000h, 0000007Fh] | 1 | 80h | 0BBBBBBBB |
[00000080h, 00003FFFh] | 2 | C0h | 10BBBBBB BBBBBBBB |
[00004000h, 1FFFFFFFh] | 4 | E0h | 110BBBBB BBBBBBBB BBBBBBBB BBBBBBBB |