* 打开网址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库的编译及使用的更多相关文章

  1. QT+OpenGL(02)-- zlib库的编译

    1.zlib库的下载 http://www.zlib.net/ zlib1211.zip 2.解压 3.进入  zlib1211\zlib-1.2.11\contrib\vstudio\vc14 目录 ...

  2. zlib库VS2015编译步骤

    [点击这里下载zlib1.2.8源码](http://zlib.net/zlib128.zip) [点击这里下载zlib1.2.8编译动态库](http://zlib.net/zlib128-dll. ...

  3. Windows下zlib库和libPng库的编译和使用

    关于zlib库和libpng是干嘛的,我就不说了,度娘和谷歌都能告诉你.这里主要记录下windows下如何利用vs2010编译和使用这两个库. 一.zlib库的编译 首先要下载这个库,这个谷歌和百度也 ...

  4. VS编译 x64版本zlib库

    编译的过程倒也不是很难.我把编译的源码和脚本及说明都放在gitee上了. 详细的可以见这里 https://gitee.com/solym/zlib-1.2.11.git 可以参考这些文章 win10 ...

  5. 如何在 window7 环境编译 zlib 库?

    1.下载最新版本 zlib 库 `下载地址:http://www.zlib.net/ 2.打开vc14项目 解压下载的 zlib.zip 压缩包并打开zlib1211\zlib-1.2.11\cont ...

  6. Windows / Linux 一件编译zlib库

    一. 下载zlib库 : http://www.zlib.net 本文以  zlib-.tar.xz  为例 二. 解压文件得到 zlib- 文件夹,修改 zlib-/CMakeLists.txt 文 ...

  7. zlib开发笔记(四):zlib库介绍、编译windows vs2015x64版本和工程模板

    前言   Qt使用一些压缩解压功能,介绍过libzip库编译,本篇说明zlib库.需要用到zlib的msvc2015x64版本,编译一下.   版本编译引导 zlib在windows上的mingw32 ...

  8. Zlib库的安装与使用

    在实际应用中经常会遇到要压缩数据的问题,常见的压缩格式有zip和rar,而Linux下那就更多了,bz2,gz,xz什么的都有,单单Linux下的解压和压缩命令就有好多呢?没有什么好不好的.查了资料, ...

  9. VC6 下 libpng 库的编译与初步使用

      VC6 下 libpng 库的编译与初步使用 目录 libong 库的介绍 VC6 下 libpng 的编译 下载 libpng 与 zlib 进行编译 得到 .lib 文件 初步使用 对 VC6 ...

随机推荐

  1. sql in interview for a job

    1.mysql下建表及插入数据 /* Navicat MySQL Data Transfer Source Server : mysql Source Server Version : 50640 S ...

  2. <![CDATA[文本内容]]>

    DTD中的属性类型 全名:character data 在标记CDATA下,所有的标记.实体引用都被忽略,而被XML处理程序一视同仁地当做字符数据看待, CDATA的形式如下: <[CDATA[ ...

  3. 使用 CLI 创建 Azure VM 的自定义映像

    自定义映像类似于应用商店映像,不同的是自定义映像的创建者是你自己. 自定义映像可用于启动配置,例如预加载应用程序.应用程序配置和其他 OS 配置. 在本教程中,你将创建自己的 Azure 虚拟机自定义 ...

  4. 【转】Kettle发送邮件步骤遇到附件名是中文名变成乱码的问题解决办法

    原文:http://www.ukettle.org/thread-607-1-1.html 本帖最后由 大白菜 于 2016-3-7 10:18 编辑 导语:看到群里很多朋友问Kettle发送邮件附件 ...

  5. Gerrit安装配置

    环境: CentOS 1611 + gerrit-2.11.4 (review.openstack.org) 1. 安装java1.8 (>1.7) [root@review ~]# yum i ...

  6. python面试十题

    问题1: 请问如何修改以下python代码,使得下面的代码调用类A的show方法? class A(): def show(self): print("base show") cl ...

  7. 高级IO

    # 高级IO 特殊的IO操作,包括文件锁.系统V的流.信号驱动的I/O.多路转I/O(select和pull函数).readv和writev函数以及存贮映射I/O等概念和函数. ## 文件锁 文件锁是 ...

  8. ant jmeter jenkins 实现自动化测试

    编者按: 本文核心的关键是ant去调用build.xml 执行自动化测试任务. bulid.xml 文件的内容按照注释修改为你自己服务器相关信息. 配置完成后一定要手动在服务器上执行一次,确保你配置的 ...

  9. 20165318 2017-2018-2 《Java程序设计》第八周学习总结

    20165318 2017-2018-2 <Java程序设计>第八周学习总结 目录 学习过程遇到的问题及总结 教材学习内容总结 第12章 Java多线程机制 代码托管 代码统计 学习过程遇 ...

  10. 1003. [ZJOI2006]物流运输【区间DP+最短路】

    Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转 停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严 ...