当前位置: 首页 > 工具软件 > FastLZ > 使用案例 >

【开源项目】FastLZ无损数据压缩

申屠弘图
2023-12-01

【开源项目】FastLZ无损数据压缩

简介

FastLZ是一个小型和可移植的基于ANSI C/C90实现LZ77算法的无损数据压缩。它适用于压缩一系列文本/段落、原始像素数据序列或任何其他具有大量重复数据块。FastLZ 只包含两个文件: FastLZ.h 和 FastLZ.c,可以直接用于任何C/C++应用程序。

由 ariya 编写,并在 MIT license下发布。

项目地址:

https://github.com/ariya/FastLZ

FastLZ着重于非常快速的压缩和解压缩,这样做的代价是牺牲压缩比。下面是项目中给出的和zlib的对比:

压缩率压缩速度解压速度
FastLZ54.2%159 MB/s305 MB/s
zlib -142.3%50 MB/s184 MB/s
zlib -936.5%11 MB/s185 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

 类似资料: