■
zlibとgzipの圧縮アーカイバーを作成。
http://www.zlib.net/ からzlib source codeをダウンロード(zipファイル)して解凍します。
この中のwin32のMakefile.mscをビルドします。
zlib.libが作成されます。
Menu->Microsoft VisualStudio2012->VisualStudio Tools->x86 NativeTools コマンドプロンプトで以下を実行。
>cd xxx\zlib-1.2.8
>nmake -f win32/Makefile.msc
zlib.h、zconf.hとzlib.libを使用したサンプルが以下
#include "zlib.h"
#define CHUNK 16384
#pragma comment( lib, "zlib.lib" )
// 特定の規定のライブラリの無視: msvcrt.libbool GZIP::Compress( const byte* src, int src_len, std::stringstream& sm )
{
z_stream strm;
unsigned char out[CHUNK];
unsigned char in[CHUNK];
ZeroMemory( &strm, sizeof(strm));
// zlib
//int ret = deflateInit(&strm, Z_DEFAULT_COMPRESSION);
// gzip
int ret = deflateInit2(&strm,Z_DEFAULT_COMPRESSION, Z_DEFLATED, 31,8,Z_DEFAULT_STRATEGY);if (ret != Z_OK)
return false;
int flush, step_size = 0;do
{
ZeroMemory(in,CHUNK);
strm.avail_in = min( CHUNK, src_len - step_size );
memcpy( in , src + step_size, strm.avail_in) ;
strm.next_in = in;
step_size += strm.avail_in;flush = (strm.avail_in == CHUNK ? Z_NO_FLUSH : Z_FINISH );
do
{
ZeroMemory(out,CHUNK);
strm.avail_out = CHUNK;
strm.next_out = out;ret = deflate(&strm, flush );
_ASSERT(ret != Z_STREAM_ERROR);UINT wlen = CHUNK - strm.avail_out;
sm.write( (char*)out, wlen );
}
while( strm.avail_out == 0 );
}
while( flush != Z_FINISH );
deflateEnd(&strm);
return true;
}
bool GZIP::DeCompress( const byte* src, int src_len, std::stringstream& sm )
{
int ret;
z_stream strm;
unsigned char in[CHUNK];
unsigned char out[CHUNK];
ZeroMemory(&strm,sizeof(strm));
// zlib
//ret = inflateInit(&strm);
// gzip
ret = inflateInit2(&strm,47);
if (ret != Z_OK)
return false;int step_size = 0;
do
{
ZeroMemory(in,CHUNK);
strm.avail_in = min( CHUNK, src_len - step_size );
memcpy( in , src + step_size, strm.avail_in) ;
strm.next_in = in;step_size += strm.avail_in;
do
{
ZeroMemory(out,CHUNK);
strm.avail_out = CHUNK;
strm.next_out = out;ret = inflate(&strm, Z_NO_FLUSH);
_ASSERT(ret != Z_STREAM_ERROR); /* state not clobbered */
switch (ret)
{
case Z_NEED_DICT:
ret = Z_DATA_ERROR; /* and fall through */
case Z_DATA_ERROR:
case Z_MEM_ERROR:
(void)inflateEnd(&strm);
return false;
}int wlen = CHUNK - strm.avail_out;
sm.write( (char*)out, wlen );
} while (strm.avail_out == 0);
} while (ret != Z_STREAM_END);
inflateEnd(&strm);
return true;
}
詳しくはここ