Welcome

首页 / 软件开发 / 数据结构与算法 / .NET/CLI元数据中使用的压缩整数

.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]180h0BBBBBBBB
[00000080h, 00003FFFh]2C0h10BBBBBB BBBBBBBB
[00004000h, 1FFFFFFFh]4E0h110BBBBB BBBBBBBB BBBBBBBB BBBBBBBB