* 打开网址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. JConsole监控Java程序的运行情况

    JConsole 一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行.您可以轻松 ...

  2. ubuntu密码正确,却不能登录图形界面

    传统的方法是修改.Xauthority文件权限,不过我试了没有用. 后来发现我的问题是因为安装了NVIDIA cuda驱动而导致的. 所以先卸载nvidia驱动,再更新,就可以正常进入了. 命令: s ...

  3. I/O复用及epoll基础知识

    IO multiplexing IO multiplexing这个词可能有点陌生,但是如果我说select,epoll,大概就都能明白了.有些地方也称这种IO方式为event driven IO.我们 ...

  4. 转: 根据屏幕分辨率,浏览器调用不同css

    <link type="text/csss" href="" rel="stylesheet"/> <link type= ...

  5. [翻译] CHTCollectionViewWaterfallLayout

    CHTCollectionViewWaterfallLayout https://github.com/chiahsien/CHTCollectionViewWaterfallLayout CHTCo ...

  6. [翻译] CRPixellatedView-用CIPixellate滤镜动态渲染UIView

    CRPixellatedView-用CIPixellate滤镜动态渲染UIView https://github.com/chroman/CRPixellatedView 本人测试的效果: Usage ...

  7. Python3.5 执行发邮件Exchangelib(=)

    fyl Python发邮件的代码如下: 只需要填写好加粗字体,即可正常使用. from exchangelib import DELEGATE, Account, Credentials, Messa ...

  8. Spring中的统一异常处理方式

    源自:https://segmentfault.com/a/1190000016236188 在具体的SSM项目开发中,由于Controller层为处于请求处理的最顶层,再往上就是框架代码的. 因此, ...

  9. 【C语言】 任意十进制数字转十六进制

    大概思路:输入任意十进制数字 首先确定位数: 使用整形数组来存储十六进制数: a[0] 表示十六进制数字的位数: #include <stdio.h> #include <stdli ...

  10. 《C++ Primer Plus》读书笔记之九—使用类

    第十一章 使用类 1.操作符函数的格式:operator op(argument-list).op是将要重载的操作符. 2.操作符重载函数的两种调用方式:①函数表示法:C=A.operator+(B) ...