[tinyuz]
May 10, 2026 · View on GitHub
中文版 | english
tinyuz 是一个无损压缩算法,为超小型嵌入式设备(MCU、NB-IoT等)设计,保持还不错的压缩率。
特色是编译后的解压缩代码(ROM或flash占用)非常的小;
流模式解压用 Mbed Studio 编译后为 626 字节(可以调整宏定义后到 506 字节);
而内存模式解压为 424 字节(可以调整宏定义后到 298 字节)。
(其他解压器用 Mbed Studio 编译后大小参考: zlib v1.3.1 流模式解压 约大于10k; lzma v22.01 流模式解压 约6k; miniLZO v2.10 内存模式解压为 868 字节(非安全模式 628 字节)。)
同时,流模式解压时内存(RAM占用)也可以非常的小,RAM大小= 字典大小(>=1Byte,压缩时指定) + 缓冲区大小(>=2Byte,解压缩时指定)。
提示:字典越小压缩率越低,而缓冲区较小时只影响解压缩速度。
支持处理巨大的数据,压缩和解压缩时都支持流式处理。
压缩和解压缩速度与数据特性和参数设置有关;在现代 CPU 上,压缩时比较慢约 0.4MB/S--2MB/S,解压缩较快约 180MB/S--300MB/S。
二进制发布包
从 release 下载 : 分别运行在 Windows、Linux、MacOS操作系统的命令行程序。
( 编译出这些发布文件的项目路径在 tinyuz/builds )
自己编译
Linux or MacOS X
$ cd <dir>
$ git clone https://github.com/sisong/tinyuz.git tinyuz
$ git clone https://github.com/sisong/HDiffPatch.git HDiffPatch
$ cd tinyuz
$ make
Windows
$ cd <dir>
$ git clone https://github.com/sisong/tinyuz.git tinyuz
$ git clone https://github.com/sisong/HDiffPatch.git HDiffPatch
用 Visual Studio 打开 tinyuz/builds/vc/tinyuz.sln 编译
命令行使用:
压缩: tinyuz -c[-dictSize] inputFile outputFile
ci压缩: tinyuz -ci[-dictSize] inputFile outputFile
解压缩: tinyuz -d[-cacheSize] inputFile outputFile
注意:-c 是默认压缩器;
但是如果你编译了解压缩器的源代码,并设置 tuz_isNeedLiteralLine=0,
那么必须使用 -ci 压缩器。
选项说明:
-dictSize
设置压缩时使用的字典大小;
1g>=dictSize>=1, 默认 -c-1m, 推荐: 127、4k、16m、256m 等...
压缩运行时需要内存约 (dictSize*18*parallelThreadNumber) 字节;
-cacheSize
设置解压时使用的缓冲区大小;
cacheSize>=2, 默认 -d-256k, 推荐: 64、1k、32k、4m 等...
解压缩运行时需要内存 (dictSize+cacheSize) 字节;
-p-parallelThreadNumber
设置线程数 parallelThreadNumber>1 时,开启多线程并行压缩模式;
默认为-p-4;多线程需要占用较多的内存。
库 API 使用:
压缩:
hpatch_StreamPos_t tuz_compress(const hpatch_TStreamOutput* out_code,const hpatch_TStreamInput* data,
const tuz_TCompressProps* props);
解压缩:
tuz_size_t tuz_TStream_read_dict_size(tuz_TInputStreamHandle inputStream,tuz_TInputStream_read read_code);
tuz_TResult tuz_TStream_open(tuz_TStream* self,tuz_TInputStreamHandle inputStream,tuz_TInputStream_read read_code,
tuz_byte* dict_and_cache,tuz_size_t dict_size,tuz_size_t cache_size);
tuz_TResult tuz_TStream_decompress_partial(tuz_TStream* self,tuz_byte* out_data,tuz_size_t* data_size);
也可以在内存中一次全部解压缩:
tuz_TResult tuz_decompress_mem(const tuz_byte* in_code,tuz_size_t code_size,tuz_byte* out_data,tuz_size_t* data_size);
移植解压算法到嵌入式设备:
- 将
tinyuz/decompress/整个目录添加或拷贝到你的项目工程中; - 在需要使用解压缩算法的地方添加
tuz_dec.h头文件的引用,并调用该文件中声明的解压缩函数。
压缩率测试:
压缩率: 压缩后大小/压缩前大小
tinyuz v1.1.1 测试时字典大小分别设置为 1MB,32KB,4KB,1KB,255B
(表中'tuz -32k' 表示: tinyuz -c-32k)
zlib v1.3.1 测试时设置压缩水平为9, 窗口比特大小设置为-15(即字典大小32KB)
QuickLZ v1.5.0 测试时使用默认设置QLZ_COMPRESSION_LEVEL=3, QLZ_STREAMING_BUFFER=1048576
tamp v1.7.0 测试时窗口比特大小分别设置为15和12(即字典大小32KB和4KB)
heatshrink v0.4.1 测试时窗口比特大小设置为12(即字典大小4KB), lookahead_sz2=6
FastLZ v0.5.0 测试时设置压缩水平为2
miniLZO v2.10 测试时lzo1x_1_compress函数, wrkmem使用了默认的LZO1X_1_MEM_COMPRESS=16k*sizeof(void*)大小
"aMCU.bin" 是一个MCU设备的固件文件;
"aMCU.bin.diff" 是用两个不同版本的固件文件来创建的一个未压缩的补丁文件(用 HPatchLite 所创建);
"A10.jpg"--"world95.txt" 从 http://www.maximumcompression.com/data/files/index.html 下载
"enwik8" 从 https://data.deepai.org/enwik8.zip 下载
"silesia.tar" 从 https://sun.aei.polsl.pl//~sdeor/index.php?page=silesia 下载
| test file | tuz 1m | tuz 32k | tuz 4k | tuz 1k | tuz 255 | zlib 32k | QuickLZ | tamp 32k | tamp 4k | heatshrink 4k | FastLZ | miniLZO |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| aMCU.bin | 45.80% | 45.98% | 49.64% | 54.29% | 60.61% | 46.54% | 54.49% | 57.87% | 56.11% | 58.52% | 62.21% | 61.33% |
| aMCU.bin.diff | 5.75% | 5.75% | 5.99% | 6.35% | 6.89% | 5.29% | 9.52% | 18.91% | 16.78% | 9.26% | 12.50% | 14.21% |
| A10.jpg | 99.99% | 99.99% | 99.99% | 99.99% | 99.99% | 99.88% | 100.00% | 107.79% | 108.27% | 112.16% | 102.91% | 100.38% |
| AcroRd32.exe | 42.11% | 43.79% | 46.98% | 51.45% | 58.27% | 44.88% | 52.07% | 55.86% | 54.17% | 56.15% | 61.22% | 61.44% |
| english.dic | 28.65% | 29.20% | 30.10% | 31.25% | 33.49% | 25.83% | 35.50% | 39.81% | 36.64% | 36.82% | 40.86% | 43.82% |
| FlashMX.pdf | 83.14% | 84.26% | 85.97% | 87.07% | 89.20% | 84.76% | 100.00% | 92.92% | 93.40% | 96.60% | 89.57% | 91.73% |
| FP.LOG | 5.26% | 7.36% | 10.34% | 12.67% | 19.27% | 6.46% | 8.59% | 20.95% | 21.51% | 14.12% | 11.97% | 13.01% |
| MSO97.DLL | 54.06% | 56.91% | 60.17% | 64.31% | 70.60% | 57.94% | 65.65% | 67.75% | 65.78% | 70.49% | 74.80% | 75.57% |
| ohs.doc | 20.88% | 24.38% | 26.98% | 30.90% | 37.29% | 24.05% | 25.72% | 38.34% | 38.15% | 33.51% | 28.31% | 30.41% |
| rafale.bmp | 30.40% | 32.66% | 35.80% | 40.81% | 43.52% | 30.23% | 42.06% | 37.38% | 39.72% | 40.30% | 52.63% | 55.41% |
| vcfiu.hlp | 17.79% | 20.39% | 24.51% | 27.46% | 32.39% | 20.41% | 24.88% | 32.77% | 33.87% | 30.42% | 32.36% | 34.10% |
| world95.txt | 23.44% | 30.79% | 48.07% | 54.96% | 65.22% | 28.87% | 35.17% | 38.18% | 51.30% | 54.32% | 52.04% | 51.56% |
| enwik8 | 33.22% | 38.36% | 44.81% | 51.53% | 63.38% | 36.45% | 44.79% | 44.48% | 48.04% | 50.41% | 54.52% | 55.79% |
| silesia.tar | 29.60% | 33.22% | 38.93% | 44.41% | 52.57% | 31.98% | 38.60% | 42.77% | 45.09% | 44.27% | 47.25% | 47.50% |