zlib库的编译及使用
* 打开网址http://zlib.net/ 下载zlib源码,

* 解压压缩包,进入目录:C:\Users\Administrator\Desktop\zlib-1.2.11\zlib-1.2.11\contrib\vstudio\vc12,打开zlibvc.sln工程。
32位编译有以下问题:
** match686.obj : error LNK2026: 模块对于 SAFESEH 映像是不安全的。

** 解决:

** 使用zlib开源库在VS2013中开发,但是在使用uncompress函数进行解压缩过程中遇到了内存崩溃现象。
** 解决:
用c编译方式取代汇编方式,在zlib源码的zlibvc工程中,分为2步:
1.工程属性->预处理器,去掉 ASMINF 定义,这样就可以屏蔽掉汇编模块:

2.
打开zlib-1.2.11\contrib\masmx86下面的汇编文件inffas32.asm,将里面_inflate_fast全部替换成其他任意函数名,再次编译。

修改为:_inflate_fast1

64位编译有以下问题:

** 解决

修改为:cd ..\..\masmx64bld_ml64.bat

*** 库目录修改:

32位导出的函数名称与64位导出的函数名称有区别,这可能是是使用zlib 的lib库进行静态连接时,32位需要追加ZLIB_WINAPI

否则会报error LNK2019 错误:

32位导出的函数名称与64位导出的函数名称有区别如下图:
32位:

64位:


*********zlib库的使用:
工程配置,32位工程必须追加加入宏定义 :ZLIB_WINAPI,64位随意。

***** 测试代码如下:
// zlib.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h" #include <stdio.h> #include <stdlib.h>
#include <iostream>
#include <windows.h>
//extern "C"{
#include "zlib.h"
//}
//#pragma comment(lib, "32lib/zlibwapi.lib")
//------------------------------------------------------------------------测试函数---------------------------------------------------------------------------------------------------------
// 包头长度大约为192个字节
int g_nPackHead[] = {
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
, , , , , , , , , , , , , , , , , , , , , , , , , ,
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
}; const char* p5Price = "";
const char * pLastPrice = "123%06d+1811%d;"; int g_ncin = ;
int g_nLevel = ; #define TEMP_MAX 65536
//#define TEMP_MAX 200
#if 1
int _tmain(int argc, _TCHAR* argv[])
{
std::cout << "输入:\t 0.订阅一条最新价 \t1.订阅五档行情\t2.订阅五档行情/一条最新价\t3.订阅五档行情/2条最新价...以此类推,最大值为500,默认值20" << std::endl;
std::cout << "输入压缩等级(1-9):\t 1最小压缩,9为最大压缩,默认5" << std::endl;
std::cout << "输入格式:\t条数+压缩等级,如251,25条行情,1级压缩" << std::endl;
//unsigned char* testchar = new unsigned char[65536];
unsigned char testchar[TEMP_MAX];
unsigned char testchar1[TEMP_MAX];
while (true)
{
g_ncin = ;
g_nLevel = ;
memset(testchar, 0x00, TEMP_MAX); unsigned long nHeadSize = (sizeof(g_nPackHead) / sizeof(int));
unsigned long Offset = nHeadSize;
for (unsigned long i = ; i < nHeadSize; i++)
{
testchar[i] = g_nPackHead[i];
}
int indata;
std::cin >> indata; g_ncin = indata / ;
g_nLevel = indata % ; std::cout << "............................................................................................" << std::endl;
if ((g_ncin < ) || (g_ncin >))
{
g_ncin = ;
} if ((g_nLevel < ) || (g_nLevel > ))
{
g_nLevel = ;
} if ( == g_ncin)
{
strcat_s((char*)(testchar + Offset), , p5Price);
Offset += strlen(p5Price);
}
else
{
for (int i = ; i <= g_ncin - ; i++)
{
char x[];
sprintf_s(x, sizeof(x), pLastPrice, i + , i + );
strcat_s((char*)(testchar + Offset), , x);
Offset += strlen(x);
} // 追加五档行情
if (g_ncin > )
{
strcat_s((char*)(testchar + Offset), , p5Price);
Offset += strlen(p5Price);
}
} unsigned long len = Offset;
printf("压缩前src_len=%lu\tsrc: %s\n", Offset, (char*)(testchar + nHeadSize));
unsigned char dest[TEMP_MAX]; memset(dest, 0x00, TEMP_MAX);
unsigned long destLen = TEMP_MAX; //int tt = GetTickCount();
//const int count = 10 * 100 * 100;
//for (int t = 0; t < count; t++)
//{
destLen = TEMP_MAX;
memset(dest, 0x00, sizeof(dest)); //压缩
//compressBound(len);
//功能和compress函数一样,多了一个参数可以指定压缩质量和压缩数度之间的关系(1-9)。要想得到高的压缩比就要多花时间
if (Z_OK == compress2(dest, &destLen, testchar, len, g_nLevel))
{
printf("压缩后dest_len=%d\t dest: %s\n", destLen, dest);
}
else
{
printf("压缩失败\n");
}
//}
//printf("%d只股票%d次数耗时耗时======= %ld ms\n\n", g_ncin,count,GetTickCount() - tt); memset(testchar1, 0x00, sizeof(testchar1));
unsigned long src_len = TEMP_MAX;
//解压缩
if (Z_OK == uncompress2(testchar1, &src_len, dest, &destLen))
//if (Z_OK)
//if (Uncompress(testchar, &src_len, dest, destLen) == 0)
{
printf("解压后src_len=%d\tsrc: %s\n", src_len, (char*)(testchar1 + nHeadSize));
}
else
{
printf("解压缩失败\n");
} int r = memcmp(testchar, testchar1, src_len); if ( == r)
{
printf("destLen=%d\t srclen=%d\t 压缩率%f%%\n\n", destLen, src_len, (double)(destLen * ) / (double)(src_len));
}
else
{
printf("解压缩后的数据与原数据不一致\n\n");
} } system("pause"); return ;
} #else int _tmain(int argc, _TCHAR* argv[])
{
/*原始数据*/
unsigned char strsrc[] = "这些是测试数据。123456789 abcdefghigklmnopqrstuvwxyz\n\t\0abcdefghijklmnopqrstuvwxyz\n"; //包含\0字符
unsigned char buf[] = {};
unsigned char strdst[] = {};
unsigned long srclen = sizeof(strsrc);
unsigned long buflen = sizeof(buf);
unsigned long dstlen = sizeof(strdst);
int i;
// FILE * fp; printf("源串:");
for (i = ; i < srclen; ++i)
{
printf("%c", strsrc[i]);
}
printf("原串长度为:%ld\n", srclen); printf("字符串预计算长度为:%ld\n", compressBound(srclen));
//压缩
//compress(buf, &buflen, strsrc, srclen);
int ret = compress2(buf, &buflen, strsrc, srclen,);
printf("压缩后实际长度为:%ld\n", buflen);
//解压缩
uncompress(strdst, &dstlen, buf, buflen); printf("目的串:");
for (i = ; i < dstlen; ++i)
{
printf("%c", strdst[i]);
} return ;
}
#endif
zlib库的编译及使用的更多相关文章
- QT+OpenGL(02)-- zlib库的编译
1.zlib库的下载 http://www.zlib.net/ zlib1211.zip 2.解压 3.进入 zlib1211\zlib-1.2.11\contrib\vstudio\vc14 目录 ...
- zlib库VS2015编译步骤
[点击这里下载zlib1.2.8源码](http://zlib.net/zlib128.zip) [点击这里下载zlib1.2.8编译动态库](http://zlib.net/zlib128-dll. ...
- Windows下zlib库和libPng库的编译和使用
关于zlib库和libpng是干嘛的,我就不说了,度娘和谷歌都能告诉你.这里主要记录下windows下如何利用vs2010编译和使用这两个库. 一.zlib库的编译 首先要下载这个库,这个谷歌和百度也 ...
- VS编译 x64版本zlib库
编译的过程倒也不是很难.我把编译的源码和脚本及说明都放在gitee上了. 详细的可以见这里 https://gitee.com/solym/zlib-1.2.11.git 可以参考这些文章 win10 ...
- 如何在 window7 环境编译 zlib 库?
1.下载最新版本 zlib 库 `下载地址:http://www.zlib.net/ 2.打开vc14项目 解压下载的 zlib.zip 压缩包并打开zlib1211\zlib-1.2.11\cont ...
- Windows / Linux 一件编译zlib库
一. 下载zlib库 : http://www.zlib.net 本文以 zlib-.tar.xz 为例 二. 解压文件得到 zlib- 文件夹,修改 zlib-/CMakeLists.txt 文 ...
- zlib开发笔记(四):zlib库介绍、编译windows vs2015x64版本和工程模板
前言 Qt使用一些压缩解压功能,介绍过libzip库编译,本篇说明zlib库.需要用到zlib的msvc2015x64版本,编译一下. 版本编译引导 zlib在windows上的mingw32 ...
- Zlib库的安装与使用
在实际应用中经常会遇到要压缩数据的问题,常见的压缩格式有zip和rar,而Linux下那就更多了,bz2,gz,xz什么的都有,单单Linux下的解压和压缩命令就有好多呢?没有什么好不好的.查了资料, ...
- VC6 下 libpng 库的编译与初步使用
VC6 下 libpng 库的编译与初步使用 目录 libong 库的介绍 VC6 下 libpng 的编译 下载 libpng 与 zlib 进行编译 得到 .lib 文件 初步使用 对 VC6 ...
随机推荐
- linux 获取shell内置命令帮助信息 help xx
shell,命令解释器 shell内置命令有cd/umask/pwd等 help shell内置命令适用于所有用户获取shell内置命令的帮助信息help umaskhelp if
- sql 中的注释
1.单行注释 “-- ” 即:两个中滑线加一个空格 2.多行注释 "/* ... */" 示例: -- 单行注释 /* 多行注释*/ create table test(id i ...
- 实现serializable接口的作用
最重要的两个原因是: 1.将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本: 2.按值将对象从一个应用程序域发送至另一个应用程序域. 实现serializable接口的作用是就是可以 ...
- 抓取远程master分支到本地,并与UI分支合并
1.pull (1)UI: git add . git commit -m git checkout master (2)master: git pull origin master git ...
- SQL Server ->> 调用系统内建扩展存储过程"master.dbo.xp_delete_file"删除过期备份文件
DECLARE @oldDate DATETIME SET @oldDate = GETDATE()-30 EXECUTE MASTER.dbo.xp_delete_file 0, N'D:\back ...
- ORACLE闪回机制分析与研究应用
1.查看数据库归档和闪回状态,及环境准备SQL> archive log list;SQL> select flashback_on from v$database;关闭数据库,启动归档和 ...
- yii 验证码功能的实现
首先知晓我们在使用验证码的时候通常是和我们的表单小部件配合使用首先我们创建model层 新建一个php文件 名字叫做Verifycode.php 要在我们的model层 创建我们的验证码的验证规则,我 ...
- 关于Excel中的数据透视表没有数据
在你想要使用数据透视表的时候,区域一定要正确 然后把你想要的数据按行列排好 如果没有数据 请点击刷新数据……刷新数据……刷新数据 我竟然被这个睿智的问题困扰好久……
- JavaScript基础进阶之常用字符串方法总结
前面三篇文章简单的把JavaScript基础内容过了一遍,我们已经可以用JavaScript写一些简单的代码了. 今天主要总结一下JavaScript中String对象中自带的一些方法,来帮助我们处理 ...
- div内容过长自动省略号
<div class="tits" style="width:900px;">${item.note}</div> //自 ...