嵌入式目标板程序的压缩(1)--学习使用LZMA SDK

本文介绍了如何利用LZMA SDK进行嵌入式目标板程序的压缩,通过C接口实现简单命令行压缩工具,并测试了压缩性能与解压正确性,以减少串口升级的时间。
摘要由CSDN通过智能技术生成

 

之前完成了串口升级到功能之后,觉得700多K一分多钟的传输时间应该还有优化空间。波特率最大就115200bps,而且有些特殊时候还要降到19200用,所以减少程序大小是个途径。一般要显著减少代码量比较困难,除非程序里面“废话”太多;而且做编译器优化实验观察,差异还不到10%。压缩自然是个好方法,某次打rar包仔细看了下,500多K的程序压到不到200k,看来效果比较明显。于是有了以下想法:

一。找一个公开的压缩算法,最好有良好的C接口

二。测试该算法的压缩性能,压缩比大概跟Winrar差不多,不多于1倍就好

三。移植解压部分到目标板程序,实现[上位机压缩程序]->[串口传输]->[目标板解压升级程序]的串口升级流程

 

首先是找一个公开的压缩算法:

LZW

http://zh.wikipedia.org/zh/LZW

LZMA

http://zh.wikipedia.org/wiki/LZMA

.....

然后不停地搜源码下源码,下了一堆。浏览了一下”战利品“,最后发现有个LZMA SDK的C实现比较合我胃口。用vs写了个console工程,就调用LzmaLib里面的LzmaCompress和LzmaUncompress接口,参数全部默认,实现了一个简单的命令行压缩工具。

 

这里小结下Lzma SDK的使用:

最顶层的接口是LzmaCompress和LzmaUncompress,位于LzmaLib.c中,声明如下:

//--------------------------------------------//

MY_STDAPI LzmaCom

使用7-Zip库中的lzma压缩大文件,您需要遵循以下步骤: 1. 下载7-Zip SDK并解压缩到您的计算机。 2. 使用以下代码包含必要的头文件: ```c #include "lzma/LzmaEnc.h" #include "lzma/LzmaDec.h" ``` 3. 创建一个LzmaEncHandle和LzmaEncProps结构体来设置压缩选项: ```c LzmaEncHandle enc = LzmaEnc_Create(&g_Alloc); LzmaEncProps props; LzmaEncProps_Init(&props); props.level = 5; // 压缩级别 props.dictSize = 1 << 26; // 字典大小 props.reduceSize = (1 << 30) - 1; // 压缩后文件大小 props.lp = 0; // 用于匹配模式的扩展字节数 props.pb = 2; // 用于匹配模式的字节数 props.fb = 128; // 用于匹配模式的字节数 props.numThreads = 2; // 使用的线程数 ``` 4. 使用LzmaEnc_SetProps函数将压缩选项应用于LzmaEncHandle: ```c LzmaEnc_SetProps(enc, &props); ``` 5. 打开要压缩的大文件,并为输出文件创建一个文件句柄: ```c FILE* inFile = fopen("input_file", "rb"); FILE* outFile = fopen("output_file.lzma", "wb"); ``` 6. 编写循环,将文件分段读取并压缩: ```c int inSize = 1 << 16; // 每次读取的输入文件大小 int outSize = 1 << 16; // 每次写入的输出文件大小 unsigned char* inBuf = (unsigned char*)malloc(inSize); unsigned char* outBuf = (unsigned char*)malloc(outSize); while (true) { // 读取输入文件 size_t bytesRead = fread(inBuf, 1, inSize, inFile); if (bytesRead == 0) { break; } // 压缩数据 size_t outPos = 0; size_t outLen = outSize; LzmaEnc_Encode(enc, outBuf, &outLen, inBuf, bytesRead, &g_Alloc, &g_Alloc); // 写入输出文件 fwrite(outBuf, 1, outLen, outFile); } ``` 7. 关闭文件句柄和LzmaEncHandle,并释放内存: ```c fclose(inFile); fclose(outFile); LzmaEnc_Destroy(enc, &g_Alloc, &g_Alloc); free(inBuf); free(outBuf); ``` 这样,您就可以使用7-Zip库中的lzma压缩大文件了。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值