zlib deflate and inflate class for c++

Compression.h
/*
 * Compression.h
 *
 *  Created on: Aug 26, 2013
 *      Author: jerome
 */

#ifndef COMPRESSION_H_
#define COMPRESSION_H_

#include <zlib.h>
#include <zconf.h>
#include <iostream>
#include <vector>

#define COMPRESSION_LEVEL Z_DEFAULT_COMPRESSION
#define BUFFER_SIZE 16384

typedef std::vector<unsigned char> StlVecUnChar;

class Compression
{
public:
    enum CompressLevel
    {
        NO_COMPRESSION      = Z_NO_COMPRESSION,
        BEST_SPEED          = Z_BEST_SPEED,
        BEST_COMPRESSION    = Z_BEST_COMPRESSION,
        DEFAULT_COMPRESSION = Z_DEFAULT_COMPRESSION
    };

	Compression()
        : m_zstream(), m_IsCompress(true), m_bufferInCapa(BUFFER_SIZE), m_bufferOutCapa(BUFFER_SIZE), m_compressLevel(DEFAULT_COMPRESSION)
	{
	}
    Compression(bool isCom, CompressLevel level = DEFAULT_COMPRESSION)
        : m_zstream(), m_IsCompress(isCom), m_bufferInCapa(BUFFER_SIZE), m_bufferOutCapa(BUFFER_SIZE), m_compressLevel(level)
	{
	}
	virtual ~Compression();

	int Init();

    int Deflate(const StlVecUnChar &inStr, StlVecUnChar &outStr);
    int Inflate(const StlVecUnChar &inStr, StlVecUnChar &outStr);

private:

    z_stream      m_zstream;               // Stream structure used by zlib
    bool          m_IsCompress;            // True: compress. False: decompress
    unsigned char m_bufferIn[BUFFER_SIZE]; // Input buffer for zlib
    unsigned char m_bufferOut[BUFFER_SIZE];// Output Buffer for zlib
    const int     m_bufferInCapa;          // Input buffer capacity
    const int     m_bufferOutCapa;         // Output buffer capacity
    CompressLevel m_compressLevel;         // Compress level
};

#endif /* COMPRESSION_H_ */
Compression.cpp
/*
 * Compression.cpp
 *
 *  Created on: Aug 26, 2013
 *      Author: jerome
 */

#include "Compression.h"
#include <cstdio>
#include <cstring>
#include <cassert>


Compression::~Compression() {
	// TODO Auto-generated destructor stub
}

int Compression::Init()
{
    int ret;
	m_zstream.zalloc = NULL;
	m_zstream.zfree  = NULL;
	m_zstream.opaque = NULL;
	if(m_IsCompress)
	{
		ret = deflateInit2_(&m_zstream, m_compressLevel, Z_DEFLATED, MAX_WBITS,
				MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY, ZLIB_VERSION, sizeof(z_stream));
	}
	else
	{
		ret = inflateInit2_(&m_zstream, MAX_WBITS, ZLIB_VERSION, sizeof(z_stream));
	}

	return ret;
}

int Compression::Deflate(const StlVecUnChar &inStr, StlVecUnChar &outStr)
{
    int ret;
    int flush;

    size_t lastByte = inStr.size ();
	int have  = 0;
    while (lastByte > 0)
	{
        if (lastByte > m_bufferInCapa)
		{
            memcpy (m_bufferIn, &inStr[inStr.size () - lastByte], m_bufferInCapa);
            lastByte           -= m_bufferInCapa;
            m_zstream.avail_in  = m_bufferInCapa;
            flush               = Z_NO_FLUSH;
		}
		else
		{
            memcpy (m_bufferIn, &inStr[inStr.size () - lastByte], lastByte);
            m_zstream.avail_in = lastByte;
            lastByte           = 0;
            flush              = Z_FINISH;
		}
        m_zstream.next_in  = m_bufferIn;

		do
		{
            m_zstream.avail_out = m_bufferOutCapa;
            m_zstream.next_out  = m_bufferOut;

			ret = deflate(&m_zstream, flush);
			assert(ret != Z_STREAM_ERROR);
            have = m_bufferOutCapa - m_zstream.avail_out;
            outStr.insert (outStr.end (), m_bufferOut, m_bufferOut + have);
		}while(m_zstream.avail_out == 0);
		assert(m_zstream.avail_in == 0);
	}

	// Finish deflate
	(void)deflateEnd(&m_zstream);
	return Z_OK;
}

int Compression::Inflate(const StlVecUnChar &inStr, StlVecUnChar &outStr)
{
    int ret;

	int lastByte = inStr.size();
	int have  = 0;
	while (lastByte > 0)
	{
        if (lastByte > m_bufferInCapa)
		{
            memcpy(m_bufferIn, &inStr[inStr.size () - lastByte], m_bufferInCapa);
            lastByte          -= m_bufferInCapa;
            m_zstream.avail_in = m_bufferInCapa;
		}
		else
		{
            memcpy(m_bufferIn, &inStr[inStr.size () - lastByte], lastByte);
			m_zstream.avail_in = lastByte;
			lastByte = 0;
		}
        m_zstream.next_in  = m_bufferIn;

		do
		{
            m_zstream.next_out  = m_bufferOut;
            m_zstream.avail_out = m_bufferOutCapa;

			ret = inflate(&m_zstream, Z_NO_FLUSH);
			assert(ret != Z_STREAM_ERROR);
			switch(ret)
			{
			case Z_NEED_DICT:
				ret = Z_DATA_ERROR;
			case Z_DATA_ERROR:
			case Z_MEM_ERROR:
				(void)inflateEnd(&m_zstream);
				return ret;
			}

            have  = m_bufferOutCapa - m_zstream.avail_out;
            outStr.insert (outStr.end (), m_bufferOut, m_bufferOut + have);
		}while(m_zstream.avail_out == 0);
	}

	(void)inflateEnd(&m_zstream);

	return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
}
Download source file.

转载于:https://my.oschina.net/jeromecui/blog/157070

微信小程序中使用zlib.inflate可以解压缩压缩过的数据。以下是使用zlib.inflate进行解压缩的简要步骤: 1. 引入zlib库:在小程序的代码文件中引入zlib库,通过 `const zlib = require('zlib.min.js')` 来引入。 2. 创建inflate对象:使用 `zlib.createInflate()` 方法创建一个inflate对象。 3. 设置输入数据:通过 `inflate.setInput(inputData)` 方法设置输入数据。输入数据应该是压缩过的数据(例如,base64编码的压缩数据)。 4. 解压缩数据:使用 `inflate.inflate()` 方法解压缩数据。 5. 获取解压缩后的数据:通过 `inflate.getBytes()` 方法获取解压缩后的数据。 6. 处理解压缩后的数据:根据实际业务需求对解压缩后的数据进行处理,例如,将解压缩的数据展示到小程序界面上或者存储到本地。 需要注意的是,zlib.inflate在微信小程序中是异步操作,所以需要通过回调函数或者Promise来处理解压缩完成后的操作。 简单示例代码: ```javascript const zlib = require('zlib.min.js'); // 输入数据:base64编码的压缩数据 const inputData = '压缩数据的base64编码'; // 创建inflate对象 const inflate = zlib.createInflate(); // 设置输入数据 inflate.setInput(Buffer.from(inputData, 'base64')); // 解压缩数据 const outputData = inflate.inflate(); // 获取解压缩后的数据 const result = inflate.getBytes(); // 处理解压缩后的数据 console.log(result); // 打印解压缩后的数据 ``` 注意,以上示例仅仅为了演示zlib.inflate的基本使用,实际使用时可能需要根据具体需求进行适当的修改和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值