使用压缩 API
许多应用程序需要使用无损数据压缩和解压缩。 压缩 API 通过公共 API 公开了 Windows 压缩算法,从而简化了这一过程。 每种压缩算法都有一组控制其行为的属性。 压缩 API 提供了一个接口,让开发人员能够设置或查询这些属性的值。 支持的压缩算法的所有属性都有默认值,代表这些属性的常用值。 如果压缩和解压缩都需要某个属性,则默认值将相同,以确保压缩和解压缩使用相同的值。
选择压缩算法
在开发人员确定应用程序需要压缩或解压数据后,下一步就是选择压缩算法。 这可能取决于测试结果,以找到针对特定应用的速度、压缩比和内存要求的最佳性能组合。 以下列表对压缩 API 目前支持的压缩算法进行了相对比较。 并不是每种压缩算法都有每种选项,而且由于性能可能取决于输入数据,因此比较是近似的。
XPRESS (COMPRESS_ALGORITHM_XPRESS)
- 速度非常快,所需资源少
- 中等压缩比
- 高压缩和解压缩速度
- 低内存要求
- 支持 COMPRESS_INFORMATION_CLASS 枚举中的 COMPRESS_INFORMATION_CLASS_LEVEL 选项。 默认值为 (DWORD)0。 对于某些数据,值 (DWORD)1 可以提高压缩率,但压缩速度会稍慢。
使用 Huffman 编码的 XPRESS (COMPRESS_ALGORITHM_XPRESS_HUFF)
- 压缩比高于 COMPRESS_ALGORITHM_XPRESS
- 中等压缩比
- 中到高压缩和解压缩速度
- 低内存要求
- 支持 COMPRESS_INFORMATION_CLASS 枚举中的 COMPRESS_INFORMATION_CLASS_LEVEL 选项。 默认值为 (DWORD)0。 对于某些数据,值 (DWORD)1 可以提高压缩率,但压缩速度会稍慢。
MSZIP (COMPRESS_ALGORITHM_MSZIP)
- 使用的资源比 COMPRESS_ALGORITHM_XPRESS_HUFF 多
- 生成与 RFC 1951 类似的压缩块。
- 中高压缩比
- 中速压缩和高速解压缩
- 中等内存需求
LZMS (COMPRESS_ALGORITHM_LZMS)
- 如果要压缩的数据大小超过 2MB,此算法就很好。
- 高压缩比
- 低速压缩和高速解压缩
- 中高内存需求
- 支持 COMPRESS_INFORMATION_CLASS 枚举中的 COMPRESS_INFORMATION_CLASS_BLOCK_SIZE 选项。 为获得更好的压缩比,建议最小大小为 1 MB。
确定使用哪种压缩 API 模式
开发人员选择压缩算法后,下一个决定是使用压缩 API 的两种模式中的哪一种:缓冲区模式或块模式。 缓冲模式是为方便使用而开发的,建议在大多数情况下使用。
缓冲区模式会自动将输入缓冲区分割成大小适合所选压缩算法的块。 缓冲区模式会自动格式化未压缩的缓冲区大小,并将其存储到压缩缓冲区中。 压缩缓冲区的大小不会自动保存,应用程序需要保存该大小以便解压缩。 调用 CreateCompressor 和 CreateDecompressor 以使用缓冲模式时,请勿在 Algorithm 参数中包含 COMPRESS_RAW 标记。 有关缓冲区模式应用程序的代码示例,请参阅在缓冲区模式下使用压缩 API 部分。
块模式使开发人员能够控制块的大小,但需要应用程序做更多的工作。 使用块模式时,应用程序必须在压缩时将输入数据分割成适当大小的块,然后在解压缩时将这些块重新组合在一起。 如果输入缓冲区的大小大于压缩算法的内部块大小,块模式就会失效。 MSZIP 和 XPRESS 压缩算法的内部块大小分别为 32KB 和 1GB。 LZMS 的内部块大小可配置到 64GB,但内存使用量会相应增大。 压缩缓冲区的大小不会自动保存,应用程序也需要保存该大小以便解压缩。 Decompress 的 UncompressedBufferSize 参数值必须完全等于未压缩数据的原始大小,而不仅仅是输出缓冲区的大小。 这意味着在使用块模式时,应用程序应保存未压缩数据的精确原始大小,以及压缩数据和压缩后的大小。 同时调用 CreateCompressor 和 CreateDecompressor 以使用块模式时,请在 Algorithm 参数中包含 COMPRESS_RAW 标记。 有关块模式应用程序的代码示例,请参阅在块模式下使用压缩 API 部分。
自定义内存分配
缓冲区和块模式应用程序在调用 CreateCompressor 和 CreateDecompressor 时可以选择指定自定义内存分配例程。 AllocationRoutines 参数指定了包含内存分配例程的 COMPRESS_ALLOCATION_ROUTINES 结构。 然后,应用程序可以使用 SetCompressorInformation 为压缩器设置块大小。 有关简单的自定义分配例程示例,请参阅在块模式下使用压缩 API 部分。