Minlzma-最小LZMA项目

2020-06-14 07:38:10

这个最小的LZMA(Minlzma)项目旨在提供一个最小的、跨平台的、高度注释的、符合标准的C库(Minlzlib),用于在XZ容器中以LZMA格式解压LZMA2封装的压缩数据,就像可以用Python3.6、7-zip和xzutils生成的那样。此外,还提供了一个简单的、可移植的命令行工具(Minlzdec),用于执行所提供的输入文件的功能。

/*@Brief将XZ流从InputBuffer解压缩到OutputBuffer。**@Description XZ流必须包含带有LZMA2过滤器*且没有BJC2过滤器的单个块,使用默认的LZMA属性,并使用*CRC32或NONE作为校验和类型。**@param[in]InputBuffer-包含XZ流的完全形成的缓冲区。*@param[in]InputSize-输入缓冲区的大小。*@param[inopt]OutputBuffer-接收输出的完全分配的缓冲区。*调用者如果不想解压,可以传入NULL,*并将OutputSize设置为0,以查询*解压后缓冲区的最终预期大小。*@param[InOut]OutputSize-on input,缓冲区的大小。输出时,解压缩结果的*大小。**@return true-OutputBuffer中输入缓冲区已完全解压缩*false-解压过程中失败。*/bool XzDecode(uint8_t*InputBuffer,uint32_t InputSize,uint8_t*OutputBuffer,uint32_t*OutputSize);

为了提供极大的简单性、快速的性能、最小的源代码和较小的编译大小,minlzlib对输入文件进行了某些假设,并具有某些约束或限制:

整个输出缓冲区必须分配固定的大小--但是,调用方可以查询所需的大小。

XZ文件必须是";实体";,即:单个块(重置单个字典/属性)。

LZMA2属性字节必须指示LZMA属性lc=3、pb=2、lc=0。

XZ块不得具有可选的";压缩大小";和/或";未压缩大小";VLI元数据。

请注意,虽然这些假设可能看起来过于严格,但它们与xzutils、选择XZ作为格式时的7-zip和Python LZMA模块生成的常见文件相对应。大多数编码器不支持XZ/LZMA2&LZMA2声称的绝大多数功能,如SHA256或CRC64、多块等。

MINLZ_INTEGRITY_CHECKS--此选项配置是否应该执行或跳过XZ数据结构和压缩块的CRC32校验和。删除此功能可提高性能,该性能随输入文件的大小而扩展。其结果是库大小的增加最小,并且还需要实现特定于平台的CRC32校验和函数,该函数对应于以下原型:uint32_t OsComputeCrc32(uint32_t初始,常量uint8_t*data,uint32_t长度);

MINLZ_META_CHECKS--该选项配置是否应该完全信任输入文件以符合minlzlib的要求,并且不需要检查各种流头标志或块头标志和其他属性。此外,索引和流脚也被完全忽略。此模式可在约3.6 GHz的单处理器上实现10kb以下的库,可解码100MB/s。仅当输入文件在加密的防篡改安全通道或容器(如签名的散列)中包装或传递时,才建议这样做。

在Visual Studio 2019中,您可以使用File->;Open->;CMake并将其指向顶级CMakeFiles.txt,然后选择Win-AMD64目标或Win-Release-AMD64目标。前者构建没有优化的二进制文件,后者构建带有调试符号的完全优化的二进制文件(为了提高速度)。

作者要感谢以下巨人的肩头,他们的代码、文档和编写在这项工作中功不可没: