[tinyuz]

May 10, 2026 · View on GitHub

release license PRs Welcome +issue Welcome
Build Status
中文版 | 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 filetuz 1mtuz 32ktuz 4ktuz 1ktuz 255zlib 32kQuickLZtamp 32ktamp 4kheatshrink 4kFastLZminiLZO
aMCU.bin45.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.diff5.75%5.75%5.99%6.35%6.89%5.29%9.52%18.91%16.78%9.26%12.50%14.21%
A10.jpg99.99%99.99%99.99%99.99%99.99%99.88%100.00%107.79%108.27%112.16%102.91%100.38%
AcroRd32.exe42.11%43.79%46.98%51.45%58.27%44.88%52.07%55.86%54.17%56.15%61.22%61.44%
english.dic28.65%29.20%30.10%31.25%33.49%25.83%35.50%39.81%36.64%36.82%40.86%43.82%
FlashMX.pdf83.14%84.26%85.97%87.07%89.20%84.76%100.00%92.92%93.40%96.60%89.57%91.73%
FP.LOG5.26%7.36%10.34%12.67%19.27%6.46%8.59%20.95%21.51%14.12%11.97%13.01%
MSO97.DLL54.06%56.91%60.17%64.31%70.60%57.94%65.65%67.75%65.78%70.49%74.80%75.57%
ohs.doc20.88%24.38%26.98%30.90%37.29%24.05%25.72%38.34%38.15%33.51%28.31%30.41%
rafale.bmp30.40%32.66%35.80%40.81%43.52%30.23%42.06%37.38%39.72%40.30%52.63%55.41%
vcfiu.hlp17.79%20.39%24.51%27.46%32.39%20.41%24.88%32.77%33.87%30.42%32.36%34.10%
world95.txt23.44%30.79%48.07%54.96%65.22%28.87%35.17%38.18%51.30%54.32%52.04%51.56%
enwik833.22%38.36%44.81%51.53%63.38%36.45%44.79%44.48%48.04%50.41%54.52%55.79%
silesia.tar29.60%33.22%38.93%44.41%52.57%31.98%38.60%42.77%45.09%44.27%47.25%47.50%

联系

housisong@hotmail.com