Zlib库的使用实现对zip文件的解压缩
实习项目中涉及到获取GigEVision设备的XML设备描述文件
A GigE Vision device MUST have an XML device description with the syntax described
in the GenApi module of the GenICam standard.
XML文件有两种形式:压缩的(.zip)XML文件,和未压缩的(.xml)XML文件
对应两种url描述:
1)Local:MER-200-14Gx_V1.0.29.zip;40ba0000;c350
2)Local:eco655MVGE_r2_v1.6.0_b2545.xml;10000;271DC
对于未压缩的.xml文件,直接读取就行;对于压缩的.zip文件,需要进行解压缩
于是去了解了zip文件的压缩原理,推荐文章:http://blog.csdn.net/ljh0302/article/details/50381470
发现zip的压缩原理还是比较复杂的,要手动去写一个zip的解压缩程序还是很费力,于是考虑用已有的解压缩的库zlib来实现。
一、下载并配置zlib
系统Win7 64位
官网下载编译好的DLL:zlib128-dll.zip,官网地址http://www.zlib.net/ 选择如下的版本
zlib compiled DLL,version 1.2.8, zipfile format (139K, MD5 checksum 42eccc2af5bac6b7a1188d7817d03549):
同时我上传了一份资源,地址:http://download.csdn.net/detail/ljh0302/9373083
在VS2010中使用zlib的静态库
将zlib128-dll/include 中的zconf.h 和 zlib.h加入工程的目录下,并且添加作为头文件
将zlib128-dll/lib中的zdll.lib复制到工程的资源目录
将zlib-128-dll/zlib1.dll放入C:\Windows\SysWOW64(因为系统是64位,32位则放入C:\\Windows\\System32)
配置文件项目-属性-链接器-输入,在附加依赖项中加入zdll.lib,在忽略特定默认库中加入MSVCRT
最后在使用的时候include头文件即可
#include "zconf.h"
#include "zlib.h"
#pragma comment(lib,"zdll.lib")
注意:
这里的项目必须是win32的,因为编译好的zlib dll是32位的,而且官网上好像只提供了这一种,换成x64是不可行的
二、如果希望x64的工程能够使用zlib呢?
下载zlib128.zip自己进行编译,我上传一份资源,地址:http://download.csdn.net/detail/ljh0302/9373381
如何编译参考文章:http://blog.sina.com.cn/s/blog_6e0693f70100sjgj.html
不过进行的编译的时候会报错LINK : fatal error LNK1104: 无法打开文件“x64\ZlibDllDebug\zlibwapi.lib”
虽然最后只用静态库是可以,但是一直不清楚这个错误是为什么,求教知道的同行
而我只使用了zconf.h zlib.h 和zlibstat.lib三个文件,利用静态库,配置很简单,如下
#include "zconf.h"
#include "zlib.h"
即可
三、zlib库函数的使用
1、int compress(Bytef *dest, uLongf *destLen, const Bytef* source, uLong sourceLen);
compress函数将source缓冲区的内容压缩到dest压缩区。sourceLen表示source缓冲区的大小(以字节计)。
destLen是传址调用,当调用函数的时候,destLen表示dest缓冲区的大小 destLen>(sourceLen + 12)*100.1%
或者使用compressBound(sourceLen),当函数退出,destLen表示压缩后缓冲区的实际大小
compress 若成功,返回Z_OK,若没有足够内存,返回Z_MEM_ERROR,若缓冲区不够大,则返回Z_BUF_ERROR
2、int uncompress(Bytef *dest ,uLongf *destLen, const Bytef*source, uLong sourceLen);
uncompress函数将source缓冲区的内容解压缩到dest缓冲区。sourceLen是source缓冲区的大小,destLen是传址调用,dest缓冲区必须足以容下解压后的数据,函数退出后,destLen是解压后的数据的实际大小
uncompress若成功,则返回Z_OK,若没有足够内存,则返回Z_MEM_ERROR,若输出缓冲区不够,则Z_BUF_ERROR,若输入数据有误,则返回Z_DATA_ERROR
#include "zconf.h"
#include "zlib.h"
#include <iostream>
using namespace std;#pragma comment(lib,"zdll.lib")int main()
{int err;Byte compr[200],uncompr[200];uLong comprLen,uncomprLen;const char* hello = "1213135454646544665456465465457877874655312333131";uLong len = strlen(hello)+1;comprLen = sizeof(compr)/sizeof(compr[0]);err = compress(compr,&comprLen,(const Bytef*)hello,len);if(err != Z_OK){cerr<<"compress error: "<<err<<endl;exit(1);}cout<<"original size: "<<len<<" ,compressed size: "<<comprLen<<endl;strcpy((char*)uncompr,"garbage");err = uncompress(uncompr,&uncomprLen,compr,comprLen);if(err != Z_OK){cerr<<"uncompress error: "<<err<<endl;exit(1);}else{cout<<"uncompress() succeed: "<<endl;cout<<(char*)uncompr<<endl;}return 0;
}
结果:
Zlib库的使用实现对zip文件的解压缩相关推荐
- 使用go语言GUI库实现对mp3文件的播放1(简单的播放mp3文件)
使用go语言GUI库实现对mp3文件的播放1(简单的播放mp3文件) 使用beep播放mp3文件(10num) 使用go语言GUI库fyne实现音乐播放器 要是想使用go语言实现播放mp3需要借助be ...
- java如何解压rar文件怎么打开_如何在java中实现对zip和rar文件的解压
如何在java中实现对zip和rar文件的解压 关注:101 答案:1 mip版 解决时间 2021-01-26 10:50 提问者芣①樣哋羙莮 2021-01-25 22:44 如何在java中 ...
- java实现对rar文件和zip文件的解压缩
java实现对rar文件和zip文件的解压缩 一.对zip文件的解压缩 1.1 使用ZIP4J实现 zip4j官方说明: Create, Add, Extract, Update, Remove fi ...
- 用定制标签库和配置文件实现对JSP页面元素的访问控制
用定制标签库和配置文件实现对JSP页面元素的访问控制 控制客户端访问是开发一个基于B/S的架构的系统的开发者必须考虑的问题.JSP或SERVLET规范的基于配置文件的安全策略对资源的控制是以文件为单位 ...
- 修改html时webpack热更新,利用webpack实现对html文件的热更新
webpack中webpack-dev-server是一个简单的web服务器,能够帮助咱们实现代码的热更新,即在实际开发中只需保存修改完后的代码,不用手动刷新页面就能够看到效果.在使用webpack- ...
- Qt实现对json文件的解析
json是一种轻量级的数据结构,其内部的结构是一种键值对(key-value)的组合,最外层是{ }.key是带双引号的字符串常亮,用于获取和存储:value的值可以是bool变量,字符串常量,对象或 ...
- python对excel表统计视频教程_Python实现对excel文件列表值进行统计的方法
本文实例讲述了Python实现对excel文件列表值进行统计的方法.分享给大家供大家参考.具体如下: #!/usr/bin/env python #coding=gbk #此PY用来统计一个execl ...
- 用python编excel统计表_Python实现对excel文件列表值进行统计的方法
本文实例讲述了Python实现对excel文件列表值进行统计的方法.分享给大家供大家参考.具体如下: #!/usr/bin/env python #coding=gbk #此PY用来统计一个execl ...
- Java实现对PDF文件添加水印
Java实现对PDF文件添加水印 目录 Java实现对PDF文件添加水印 导入依赖 工具方法 效果 最近项目中遇到对PDF添加水印,实现有多种,采取的是itextpdf 导入依赖 <!-- 对P ...
最新文章
- 深入解析Java OutOfMemoryError
- jquery实现表格拖拽排序
- 趣学python3(28)-pygame-蛇身随机运动(可gameover )
- FileOutputStreamTest
- 从C/C++零基础到月入9K我用了9个月
- mybatis-plus实现自动填充数据如:数据库中createTime和updateTime
- EmEditor18.1.2 注册码
- div垂直,水平居中
- 统计字符个数的c语言程序设计,编写一个函数,由实参传来一个字符串,统计此字符串中字母,数字,空格和其他字符的个数。...
- 安卓编译php,编译PHP
- 20个最漂亮的基于WordPress的企业网站
- python科学计算-python科学计算
- 计算机磁盘在线分区,电脑硬盘分区知多少 怎么分区才合理?
- C语言中整型变量四舍五入,怎样将整型变量按四舍五入转换成整数
- 奇异值分解的几何原理
- c++ C2001 常量中有换行符
- 安卓开发仿有道词典和谷歌翻译词典软件在线输入翻译源码下载
- wordpress中如何禁止或者屏蔽更新提示
- 【代码审计】PHP文件包含漏洞利用总结
- Cesium中dem或tif转terrain用于地形发布 CesiumLab系列教程