gzip 压缩解压代码示例

#include <zlib.h>
#include <iostream>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>

using namespace std;


#define RD_GZ_CHUNK  262144
#define RD_ZERO_INIT {0}

/* Compress gzip data */
/* data 原数据 ndata 原数据长度 zdata 压缩后数据 nzdata 压缩后长度 */
int gzcompress( Bytef *data, uLong ndata, 
   Bytef *zdata, uint64_t *nzdata )
{
    z_stream c_stream;
    int err = 0;
 
    if(data && ndata > 0) 
    {
        c_stream.zalloc = NULL;
        c_stream.zfree = NULL;
        c_stream.opaque = NULL;
        int iRet = -1;
        //只有设置为MAX_WBITS + 16才能在在压缩文本中带header和trailer
        if ( iRet = deflateInit2( &c_stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED,
                        MAX_WBITS + 16, 8, Z_DEFAULT_STRATEGY ) != Z_OK )
        {
            cout << "deflateInit2 return " << iRet  << endl;
            return -1;
        }

        c_stream.next_in  = data;
        c_stream.avail_in  = ndata;
        c_stream.next_out = zdata;
        c_stream.avail_out  = *nzdata;
        while(c_stream.avail_in != 0 && c_stream.total_out < *nzdata)
        {
            if(deflate(&c_stream, Z_NO_FLUSH) != Z_OK) return -1;
        }
        if(c_stream.avail_in != 0) 
            return c_stream.avail_in;
        for(;;) 
        {
            if((err = deflate(&c_stream, Z_FINISH)) == Z_STREAM_END) 
                break;
            if(err != Z_OK) 
                return -1;
        }
        if(deflateEnd(&c_stream) != Z_OK) 
            return -1;
        *nzdata = c_stream.total_out;
        return 0;
    }
    return -1;
}


char * rd_gz_decompress ( const char *compressed, int compressed_len,
        uint64_t *decompressed_lenp )
{
        int pass = 1;
        char *decompressed = NULL;
        /* First pass (1): calculate decompressed size.
        *                 (pass-1 is skipped if *decompressed_lenp is
        *                  non-zero).
        * Second pass (2): perform actual decompression.
        */
        if (*decompressed_lenp != 0LLU)
                pass++;
        for (; pass <= 2 ; pass++) 
        {
                z_stream strm = RD_ZERO_INIT;
                gz_header hdr;
                char buf[512];
                char *p;
                int len;
                int r;
                if ((r = inflateInit2(&strm, 15+32)) != Z_OK)
                        goto fail;
                strm.next_in = (Bytef *)compressed;
                strm.avail_in = compressed_len;
                if ((r = inflateGetHeader(&strm, &hdr)) != Z_OK) 
                {
                        inflateEnd(&strm);
                        goto fail;
                }
                if (pass == 1) 
                {
                        /* Use dummy output buffer */
                        p = buf;
                        len = sizeof(buf);
                } 
                else 
                {
                        /* Use real output buffer */
                        p = decompressed;
                        len = (int)*decompressed_lenp;
                }
                do
                {
                        strm.next_out = (unsigned char *)p;
                        strm.avail_out = len;
                        r = inflate(&strm, Z_NO_FLUSH);
                        switch  (r)
                        {
                        case Z_STREAM_ERROR:
                        case Z_NEED_DICT:
                        case Z_DATA_ERROR:
                        case Z_MEM_ERROR:
                                inflateEnd(&strm);
                                goto fail;
                        }
                        if (pass == 2)
                        {
                                /* Advance output pointer (in pass 2). */
                                p += len - strm.avail_out;
                                len -= len - strm.avail_out;
                        }
                } while (strm.avail_out == 0 && r != Z_STREAM_END);
                if (pass == 1)
                {
                        *decompressed_lenp = strm.total_out;
                        if (!(decompressed = (char*)malloc((size_t)(*decompressed_lenp)+1)))
                        {
                                inflateEnd(&strm);
                                return NULL;
                        }
                        /* For convenience of the caller we nul-terminate
                        * the buffer. If it happens to be a string there
                        * is no need for extra copies. */
                        decompressed[*decompressed_lenp] = '\0';
                }
                inflateEnd(&strm);
        }
        return decompressed;
fail:
        if (decompressed)
                free(decompressed);
        return NULL;
}


int main( int argc, char ** argv )
{
    int iRet = -1;


    char sBuffer[65536];
    memset( sBuffer, 0, sizeof( sBuffer ) );
   
    char * sOriginal = "Hello world!123456789001234567890123456789012345678901234567890";
     
    // compress it 
    uint64_t iCompressedLen = sizeof(sBuffer);

    gzcompress( (Bytef*)sOriginal, strlen( sOriginal ), 
        (Bytef*)sBuffer,  &iCompressedLen );

    cout << "sOriginal:" << sOriginal << ",iCompressedLen:" 
        << iCompressedLen  << endl;

    uint64_t iDecompressedLen = 0;
    char *decompressed  = (char*)rd_gz_decompress ( sBuffer, 
        iCompressedLen, &iDecompressedLen );

    if ( decompressed != NULL )
    {
        cout << "after decrypt is " << decompressed  
            << ", iDecompressedLen is " << iDecompressedLen << endl;
    }
    else
    {
        cout << "rd_gz_decompress failed."  << endl;
    }
    
    return iRet;
}
 

make.sh

 

g++ main.cpp -lz
 

 

 

sh -x make.sh

 

./a.out 
sOriginal:Hello world!123456789001234567890123456789012345678901234567890,iCompressedLen:46
after decrypt is Hello world!123456789001234567890123456789012345678901234567890, iDecompressedLen is 63
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中可以使用`java.util.zip.GZIPOutputStream`类对byte数组进行gzip压缩,使用`java.util.zip.GZIPInputStream`类对压缩后的byte数组进行压缩。 以下是一个示例代码,将一个字符串进行gzip压缩,并将压缩后的byte数组再进行压缩,最后输出压缩后的字符串: ```java import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; public class GzipExample { public static void main(String[] args) throws IOException { String inputString = "This is a test string for gzip compression and decompression."; byte[] inputBytes = inputString.getBytes(StandardCharsets.UTF_8); // 压缩 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); GZIPOutputStream gzipOutputStream = new GZIPOutputStream(outputStream); gzipOutputStream.write(inputBytes); gzipOutputStream.close(); byte[] compressedBytes = outputStream.toByteArray(); // 压缩 ByteArrayInputStream inputStream = new ByteArrayInputStream(compressedBytes); GZIPInputStream gzipInputStream = new GZIPInputStream(inputStream); ByteArrayOutputStream output = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len; while ((len = gzipInputStream.read(buffer)) > 0) { output.write(buffer, 0, len); } String outputString = new String(output.toByteArray(), StandardCharsets.UTF_8); System.out.println(outputString); // 输出: This is a test string for gzip compression and decompression. } } ``` 在上面的代码中,我们先将字符串转换为byte数组,然后使用`GZIPOutputStream`将byte数组进行压缩压缩后的byte数组输出到一个`ByteArrayOutputStream`中。接着,我们再使用`GZIPInputStream`将压缩后的byte数组进行压缩后的byte数组输出到另一个`ByteArrayOutputStream`中,最后将压缩后的byte数组转换为字符串。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值