今天,zlib是一种事实上的业界标准,以至于在标准文档中,zlib和DEFLATE常常互换使用。数以千计的应用程序直接或间接依靠zlib压缩函式库,包括:
* Linux核心:使用zlib以实作网络协定的压缩、档案系统的压缩以及开机时解压缩自身的核心。
* libpng,用于PNG图形格式的一个实现,对bitmap数据规定了DEFLATE作为流压缩方法。
zlib库已经有人移植到RTT上了,并作为RTT的一个组件在可以在建工程的时候添加进去,我的硬件平台是STM32F437II,那个组件仅仅是移植了zlib库,并提供了一个例程,zlib_sample.c,这个例程很重要,我移植gzip zip的时候就是参考这个例程的,里面月很多系统调用,比如fopen(), 在RTT下没有,这是在stdio.h中声明的一个函数,但函数定义找不到,最终与RTT的接口在哪我也不知道,但是可以确实的是在RTT下此函数可以用, 还有很多类似的问题。
估计这个程序初衷就不是让单片机用的,里面充斥的大量的系统定义,类似
#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__))
#if defined(USE_FILE32API)
#define fopen64 fopen
#define ftello64 ftell
#define fseeko64 fseek
#else
#ifdef __FreeBSD__
#define fopen64 fopen
#define ftello64 ftello
#define fseeko64 fseeko
#endif
我的处理就是顺其自然,首先那个“”WIN“”定义肯定是不能用的,然后再在其它选项中找,比如上面的定义,我就在KEIL中定义了USE_FILE32API,因为fopen fseek都能找到。
还有一个 fileno(file) 定义,我实在找不到RTT中对应的相关定义,经过查看,这个地方用在标准输入输出,stdin stdout,可以不用,我们的压缩解压缩输入输出都是文件格式,并不是标准输入输出接口,于是把相关引用的地方都屏蔽掉就行了,
经过一翻折腾折腾,终于可以编译通过了。编译通过只是开始,下面要就要研究gzip zip的命令了,这2种压缩格式都是使用的zlib库,并且都使用的命令行工作模式,
gzip 主要就是调用file_compress(*argv, outmode); 函数。
file_compress("/NOR/log.txt", "wb9f");
/* ===========================================================================
* Usage: minigzip [-c] [-d] [-f] [-h] [-r] [-1 to -9] [files...]
* -c : write to standard output
* -d : decompress
* -f : compress with Z_FILTERED
* -h : compress with Z_HUFFMAN_ONLY
* -r : compress with Z_RLE
* -1 to -9 : compression level
*/
顺便说一下,-f是 Z_FILTERED方式,压缩率很高,我刚开始使用Z_HUFFMAN_ONLY,无论使用1,还是9,压缩率都提不上,后来选择 Z_FILTERED之后,压缩率一下就提上去了。
zip我只移植了miniunz命令,这个参数太多了,我测试了很九才弄明白, 它可以分为
1.只把压缩包中的文件名、类型、日期等信息列出来。
2.解压缩所有文件。
3.解压缩其中1个文件。
printf("MiniUnz 1.01b, demo of zLib + Unz package written by Gilles Vollant\n");
printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n");
printf("Usage : miniunz [-e] [-x] [-v] [-l] [-o] [-p password] file.zip [file_to_extr.] [-d extractdir]\n\n" \
" -e Extract without pathname (junk paths)\n" \
" -x Extract with pathname\n" \
" -v list files\n" \
" -l list files\n" \
" -d directory to extract into\n" \
" -o overwrite files without prompting\n" \
" -p extract crypted file using password\n\n");
使用的的过程中,使用绝对路径不方便,还好RTT也支持相对路径, chdir()就可以了。
移植的过程中我最大的感受是RTT提供了非常完善的系统调用,只有你想不到的,没有它提供不了的。
有一个
#ifdef USE_MMAP
int gz_compress_mmap OF((FILE *in, gzFile out));
#endif
居然RTT还提供了mmap()函数,但是我认为把“”文件映射到内存“”,这操作不够通用, 所以我就没有使用,
来源:CSDN
作者:wandersky0822
链接:https://blog.csdn.net/wandersky0822/article/details/103875273