FastLZ是一个小型和可移植的基于ANSI C/C90实现LZ77算法的无损数据压缩。它适用于压缩一系列文本/段落、原始像素数据序列或任何其他具有大量重复数据块。FastLZ 只包含两个文件: FastLZ.h 和 FastLZ.c,可以直接用于任何C/C++应用程序。
由 ariya 编写,并在 MIT license下发布。
项目地址:
https://github.com/ariya/FastLZ
FastLZ着重于非常快速的压缩和解压缩,这样做的代价是牺牲压缩比。下面是项目中给出的和zlib的对比:
压缩率 | 压缩速度 | 解压速度 | |
---|---|---|---|
FastLZ | 54.2% | 159 MB/s | 305 MB/s |
zlib -1 | 42.3% | 50 MB/s | 184 MB/s |
zlib -9 | 36.5% | 11 MB/s | 185 MB/s |
FastLZ 被许多软件产品使用,从一些游戏(如死亡搁浅Death Stranding)到各种开源项目(Godot Engine,Facebook HHVM,Traffic Server,Calligra Office,OSv,Netty 等)。它甚至可以作为其他压缩项目(如 BLOSC)的基础。
更多的说明介绍:
https://ariya.github.io/FastLZ/
FastLZ 支持任何符合标准的ANSI C/C90编译器,包括流行的 GCC、 Clang、 Intel C++编译器、 Visual Studio,甚至 Tiny CC。FastLZ 适用于 Intel/AMD、 ARM 和 MIPS 等多种体系结构(32位和64位、大端和小端)。
FastLZ 的使用方法十分简单,只有两个函数。
int fastlz_compress_level(int level, const void* input, int length, void* output);
参数:
level: 压缩级别,目前,仅支持级别1和级别2。
级别1是最快的压缩,通常对短数据有用。
级别2稍微慢一点,但它提供了更好的压缩比。
无论级别如何,压缩数据都可以使用下面的函数fastlz_decompress进行解压缩。
input: 输入缓冲区,用于存放要压缩的数据。
length: 输入缓冲区的大小,最小输入缓冲区大小为16。
output: 输出缓冲区,用于存放压缩后的数据。输出缓冲区必须至少比输入缓冲区大5%,并且不能小于66字节。
返回值是压缩后的数据大小,如果输入不可压缩,则返回值可能大于长度。注意,输入缓冲区和输出缓冲区不能重叠。
int fastlz_decompress(const void* input, int length, void* output, int maxout);
参数:
input:输入缓冲区,用于存放要解压的数据。
length:输入缓冲区的长度。
output:输出缓冲区,用于存放解压后的数据。
maxout:输出缓冲区的所能容纳的最大长度。解压时会保证输出缓冲区的写入量不会超过maxout中指定的值。
返回值是解压后的数据大小。如果发生错误,例如压缩数据损坏或输出缓冲区不够大,则将返回0。注意,输入缓冲区和输出缓冲区不能重叠。
写一个非常简单的测试程序:
int main(int argc, char* argv[])
{
unsigned char testin[1048576];
unsigned char testout[1048576 * 2];
unsigned char decompressout[1048576 * 2];
int compress_len;
int decompress_len;
memset(testin, 0x5A, 1048576);
compress_len = fastlz_compress_level(1, testin, sizeof(testin), testout);
decompress_len = fastlz_decompress(testout, compress_len, decompressout, sizeof(decompressout));
printf("compress_len %d decompress_len %d\n", compress_len, decompress_len);
return 0;
}
运行结果
compress_len 12018 decompress_len 1048576
本文链接:https://blog.csdn.net/u012028275/article/details/121732375