网上有很多针对zlib的总结,但是很零散,自己经过总结,实现了用zlib压缩一个文件为gzip格式,似的可以直接使用winr工具解压。

具体方法是使用zlib的deflate系列函数,将buffer压缩为gzip格式,deflateInit2的参数注意使用MAX_WBITS+16,这样压缩后可以带gzip的头、尾信息。

然后将压缩后的内容直接写入到目标文件,保存为.gz, 使用WinR就可以直接解压了。

demo程序如下(deflate_gzip.c):

 #include <stdio.h>
#include <stdlib.h>
#include <zlib.h> /*******************************************************************************
* Compress gzip data
* @parm[data] data buffer to be compressed
* @parm[dlen] data buffer length
* @parm[zdata] data buffer to save the compressed datas
* @parm[zdlen] compressed data buffer length
* return: 0 - OK; -1 - FAIL
*******************************************************************************/
int gzcompress(Bytef *data, uLong dlen, Bytef *zdata, uLong *zdlen)
{
int err = ;
z_stream c_stream; printf("%s: data=%p, dlen=%lu, zdata=%p, *zdlen=%lu\n",
__func__, data, dlen, zdata, *zdlen); if(data && dlen > )
{
c_stream.zalloc = NULL;
c_stream.zfree = NULL;
c_stream.opaque = NULL;
//use parm 'MAX_WBITS+16' so that gzip headers are contained
if(deflateInit2(&c_stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED,
MAX_WBITS + , , Z_DEFAULT_STRATEGY) != Z_OK)
{
printf("%s: deflateinit2 failed!\n",__func__);
return -;
}
c_stream.next_in = data;
c_stream.avail_in = dlen;
c_stream.next_out = zdata;
c_stream.avail_out = *zdlen;
while(c_stream.avail_in != && c_stream.total_out < *zdlen)
{
if(deflate(&c_stream, Z_NO_FLUSH) != Z_OK) {
printf("%s: deflate failed!\n",__func__);
return -;
}
}
if(c_stream.avail_in != ) {
printf("%s: avail_in not zero!\n",__func__);
return c_stream.avail_in;
}
for(;;)
{
if((err = deflate(&c_stream, Z_FINISH)) == Z_STREAM_END)
break;
if(err != Z_OK) {
printf("%s: deflate finish fail: %d\n",__func__, err);
return -;
}
}
if(deflateEnd(&c_stream) != Z_OK) {
printf("%s: deflate end failed!\n",__func__);
return -;
}
*zdlen = c_stream.total_out;
return ;
}
return -;
} /*******************************************************************************
* Compress a file into a gzip file
* @parm[input_name] the file path to be compressed
* @parm[output_name] output path of compressed gzip file
* return: 0 - OK; -1 - FAIL
*******************************************************************************/
int compress_file_to_gzip(char * input_name, char * output_name)
{
FILE *fp = NULL;
uLong flen, clen;
unsigned char * fbuf = NULL;
unsigned char * cbuf = NULL;
char def_output_name[PATH_MAX] = {}; if((fp = fopen(input_name, "rb")) == NULL)
{
printf("%s: can not open %s!\n", __func__, input_name);
return -;
} /*load file content to buffer*/
fseek(fp, 0L, SEEK_END);
flen = ftell(fp);
fseek(fp, 0L, SEEK_SET);
fbuf = (unsigned char *)malloc(flen * sizeof(unsigned char));
if(NULL == fbuf){
printf("%s: no enough memory!\n", __func__);
goto __error;
}
fread(fbuf, sizeof(unsigned char), flen, fp);
fclose(fp);
fp = NULL; /*compute compressBound*/
clen = compressBound(flen);
cbuf = (unsigned char *)malloc(clen * sizeof(unsigned char));
if(NULL == cbuf) {
printf("%s: no enough memory!\n", __func__);
goto __error;
} if(gzcompress(fbuf, flen, cbuf, &clen))
{
printf("%s: compress %s failed!\n", __func__, input_name);
goto __error;
} if(NULL == output_name) {
snprintf(def_output_name, sizeof(def_output_name),
"%s.gz", input_name);
output_name = def_output_name;
}
if((fp = fopen(output_name, "wb")) == NULL)
{
printf("%s: can not open %s!\n", __func__, output_name);
goto __error;
}
fwrite(cbuf, sizeof(unsigned char), clen, fp); fclose(fp);
free(fbuf);
free(cbuf);
return ; __error:
if(fp) fclose(fp);
if(fbuf) free(fbuf);
if(cbuf) free(cbuf);
return -;
} int main(int argc, char * argv[])
{
if(argc < ) {
printf("too few args!\n");
return ;
} if(argc < ) {
return compress_file_to_gzip(argv[],NULL);
} return compress_file_to_gzip(argv[], argv[]);
}

编译命令:

gcc -o zlibtest deflate_gzip.c.c -lz

如果编译连接的时候示找不到deflate等函数,则需要安装zlib库,ubuntu下:

sudo apt-get install zlib1g zlib1g-dev zlibc

参考内容链接:

http://www.oschina.net/code/snippet_65636_22542

http://blog.csdn.net/turingo/article/details/8178510

zlib压缩一个文件为gzip格式的更多相关文章

  1. gulp插件实现压缩一个文件夹下不同目录下的js文件(支持es6)

    gulp-uglify:压缩js大小,只支持es5 安装: cnpm: cnpm i gulp-uglify -D yarn: yarn add gulp-uglify -D 使用: 代码实现1:压缩 ...

  2. 下载zip格式文件(压缩Excel文件为zip格式)

    Mongodb配置文件参考这一篇:http://www.cnblogs.com/byteworld/p/5913061.html package util; import java.io.Buffer ...

  3. 在Ubuntu下如何压缩一个文件夹

    .gz 解压1:gunzip FileName.gz解压2:gzip -d FileName.gz 压缩:gzip FileName .tar.gz 解压:tar zxvf FileName.tar. ...

  4. Android下文件的压缩和解压(Zip格式)

    Zip文件结构 ZIP文件结构如下图所示, File Entry表示一个文件实体,一个压缩文件中有多个文件实体. 文件实体由一个头部和文件数据组,Central Directory由多个File he ...

  5. 压缩打包介绍、gzip、bzip2、xz压缩工具

    第5周第1次课(4月16日) 课程内容: 6.1 压缩打包介绍6.2 gzip压缩工具6.3 bzip2压缩工具6.4 xz压缩工具 6.1 压缩打包介绍 为什么要给文件进行压缩呢?首先压缩和不压缩空 ...

  6. qt 调用zlib压缩与解压缩功能

    Zlib是一种免费且通用的压缩库,由于Zlib压缩效果比LZW好,而且解压缩速度快,更重要的是商业软件中使用Zlib不需要缴纳版权费,所以很多游戏都使用Zlib压缩资源文件. Zlib是由Jean-l ...

  7. Java实现文件压缩与解压[zip格式,gzip格式]

    Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个文件和任意级联文件夹进行压缩和解压,对于一些初学者来说是个很不错的实例. zip扮演着归档和压缩两个角色:gzip并 ...

  8. 解压gzip格式文件(包括网页)

    先上源码 参数说名: - source :gzip格式流内容. - len: gzip流长度 - dest: 解压后字符流指针 - gzip: 压缩标志,非0时解压gzip格式,否则按照zip解压 说 ...

  9. Linux基础------文件打包解包---tar命令,文件压缩解压---命令gzip,vim编辑器创建和编辑正文件,磁盘分区/格式化,软/硬链接

    作业一:1) 将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖) cat /etc/passwd /etc/group > /1.txt2) 将用户信息数据库文件和用户 ...

随机推荐

  1. iOS阶段学习第32天笔记(页面传值方法介绍)

    iOS学习(UI)知识点整理 一.界面传值方法 1.方法一  Block传值  通过SubView视图的Block向View视图传值改变View视图的背景色 实例代码: 1)SubViewContro ...

  2. svn中cleanup作用

    我们开发项目的时候,用版本控制软件svn提交项目时候难免会遇到cleanup,那么这个提示是怎么产生的呢?它有什么作用呢? 产生原因:SVN 本地更新时,由于一些操作中断更新,如磁盘空间不够,用户取消 ...

  3. 【JavaScript】详解JSON

    目录结构: // contents structure [-] 什么是JSON JSON和XML的比较 相同点 不同点 JSON语法 如何解析JSON文本 eval()方法 JSON.parse()方 ...

  4. jquery.datatables中文使用说明

    http://www.cnblogs.com/taizhouxiaoba/archive/2009/03/17/1414426.html 本文共四部分:官网 | 基本使用|遇到的问题|属性表 一:官方 ...

  5. navigationController 返回前N个视图

    前提是,由N个视图跳转过来的. //返回前n个 NSInteger index=[[self.navigationController viewControllers]indexOfObject:se ...

  6. Android Activity launchMode研究

    Android Activity launchMode研究 Activity的Launch mode一共有四种: standard, singleTop, singleTask, singleInst ...

  7. 获取本机IP地址

    这里有两种方法: //获取本机IP - (NSString *)localIPAddress { NSString *localIP = nil; struct ifaddrs *addrs; ) { ...

  8. android:使用RemoteView自定义Notification

    //网上相关内容较少,遂记录下来,备忘. //依然以音乐播放器demo为例. 效果截图 //锤子手机上的效果 step1 准备自定义layout 常规的实现方式,并不会因为是用于notificatio ...

  9. Wireshark设置interface 时提示“There are no interfaces on which a capture can be done ”

    Wireshark设置interface 时提示“There are no interfaces on which a capture can be done ” 解决方法: 今天在电脑上安装了WIR ...

  10. tableView简单的动画效果

    tableView 中一些动画效果通常都是实现willDisplayCell的方法来展示出一些动画的效果 (1).带有3D效果的小型动态展示 -(void)tableView:(UITableView ...