C language compression/decompression, C language Decompression

Source: Internet
Author: User
Tags uncompress

C language compression/decompression, C language Decompression

I. Introduction

The Lzlib compression library provides LZMA compression and decompression algorithm functions in the memory, including data integrity check. The compression format is lzip.

 

Refer:

http://blog.csdn.net/damenhanter/article/details/30757685

 

Ii. Installation

http://www.educity.cn/linux/1577732.html

 

Iii. Instances

Refer:

http://blog.csdn.net/turingo/article/details/8148264

 

Example 1: compression. c

# Include <stdlib. h> # include <stdio. h> # include <zlib. h> int main (int argc, char * argv []) {FILE * file; uLong flen; unsigned char * fbuf = NULL; uLong clen; unsigned char * cbuf = NULL; /* compress the data in the srcfile file using the command line parameters and store the data in the dstfile */if (argc <3) {printf ("Usage: zcdemo srcfile dstfile \ n "); return-1;} if (file = fopen (argv [1], "rb") = NULL) {printf ("Can \'t open % s! \ N ", argv [1]); return-1;}/* load source file data to the buffer */fseek (file, 0L, SEEK_END ); /* jump to the end of the file */flen = ftell (file);/* get the file length */fseek (file, 0L, SEEK_SET); if (fbuf = (unsigned char *) malloc (sizeof (unsigned char) * flen) = NULL) {printf ("No enough memory! \ N "); fclose (file); return-1;} fread (fbuf, sizeof (unsigned char), flen, file ); /* compressed data */clen = compressBound (flen); if (cbuf = (unsigned char *) malloc (sizeof (unsigned char) * clen) = NULL) {printf ("No enough memory! \ N "); fclose (file); return-1;} if (compress (cbuf, & clen, fbuf, flen )! = Z_ OK) {printf ("Compress % s failed! \ N ", argv [1]); return-1;} fclose (file); if (file = fopen (argv [2]," wb ")) = NULL) {printf ("Can \'t create % s! \ N ", argv [2]); return-1;}/* Save the compressed data to the target file */fwrite (& flen, sizeof (uLong), 1, file);/* write source file length */fwrite (& clen, sizeof (uLong), 1, file);/* write target data length */fwrite (cbuf, sizeof (unsigned char), clen, file); fclose (file); free (fbuf); free (cbuf); return 0 ;}

Decompression. c

# Include <stdlib. h> # include <stdio. h> # include <zlib. h> int main (int argc, char * argv []) {FILE * file; uLong flen; unsigned char * fbuf = NULL; uLong ulen; unsigned char * ubuf = NULL; /* decompress the data in the srcfile file using the command line parameters and store the data in the dstfile */if (argc <3) {printf ("Usage: zudemo srcfile dstfile \ n "); return-1;} if (file = fopen (argv [1], "rb") = NULL) {printf ("Can \'t open % s! \ N ", argv [1]); return-1;}/* load source file data to the buffer */fread (& ulen, sizeof (uLong), 1, file ); /* obtain the buffer size */fread (& flen, sizeof (uLong), 1, file);/* obtain the data stream size */if (fbuf = (unsigned char *) malloc (sizeof (unsigned char) * flen) = NULL) {printf ("No enough memory! \ N "); fclose (file); return-1;} fread (fbuf, sizeof (unsigned char), flen, file ); /* extract data */if (ubuf = (unsigned char *) malloc (sizeof (unsigned char) * ulen) = NULL) {printf ("No enough memory! \ N "); fclose (file); return-1;} if (uncompress (ubuf, & ulen, fbuf, flen )! = Z_ OK) {printf ("Uncompress % s failed! \ N ", argv [1]); return-1;} fclose (file); if (file = fopen (argv [2]," wb ")) = NULL) {printf ("Can \'t create % s! \ N ", argv [2]); return-1;}/* Save the decompressed data to the target file */fwrite (ubuf, sizeof (unsigned char), ulen, file); fclose (file); free (fbuf); free (ubuf); return 0 ;}

Compile

gcc -g -o compression compression.c -lzgcc -g -o decompression decompression.c -lz

Run

 

Example 2:

Refer:

http://blog.csdn.net/yoki2009/article/details/4291215http://www.cppblog.com/woaidongmao/archive/2009/09/07/95495.html
 
 
/* zpipe.c: example of proper use of zlib's inflate() and deflate()   Not copyrighted -- provided to the public domain   Version 1.2  9 November 2004  Mark Adler *//* Version history:   1.0  30 Oct 2004  First version   1.1   8 Nov 2004  Add void casting for unused return values                     Use switch statement for inflate() return values   1.2   9 Nov 2004  Add assertions to document zlib guarantees   1.3   6 Apr 2005  Remove incorrect assertion in inf() */#include <stdio.h>#include <string.h>#include <assert.h>#include "zlib.h"#define CHUNK 16384/* Compress from file source to file dest until EOF on source.   def() returns Z_OK on success, Z_MEM_ERROR if memory could not be   allocated for processing, Z_STREAM_ERROR if an invalid compression   level is supplied, Z_VERSION_ERROR if the version of zlib.h and the   version of the library linked do not match, or Z_ERRNO if there is   an error reading or writing the files. */int def(FILE *source, FILE *dest, int level){    int ret, flush;    unsigned have;    z_stream strm;    char in[CHUNK];    char out[CHUNK];    /* allocate deflate state */    strm.zalloc = Z_NULL;    strm.zfree = Z_NULL;    strm.opaque = Z_NULL;    ret = deflateInit(&strm, level);    if (ret != Z_OK)        return ret;    /* compress until end of file */    do {        strm.avail_in = fread(in, 1, CHUNK, source);        if (ferror(source)) {            (void)deflateEnd(&strm);            return Z_ERRNO;        }        flush = feof(source) ? Z_FINISH : Z_NO_FLUSH;        strm.next_in = in;        /* run deflate() on input until output buffer not full, finish           compression if all of source has been read in */        do {            strm.avail_out = CHUNK;            strm.next_out = out;            ret = deflate(&strm, flush);    /* no bad return value */            assert(ret != Z_STREAM_ERROR);  /* state not clobbered */            have = CHUNK - strm.avail_out;            if (fwrite(out, 1, have, dest) != have || ferror(dest)) {                (void)deflateEnd(&strm);                return Z_ERRNO;            }        } while (strm.avail_out == 0);        assert(strm.avail_in == 0);     /* all input will be used */        /* done when last data in file processed */    } while (flush != Z_FINISH);    assert(ret == Z_STREAM_END);        /* stream will be complete */    /* clean up and return */    (void)deflateEnd(&strm);    return Z_OK;}/* Decompress from file source to file dest until stream ends or EOF.   inf() returns Z_OK on success, Z_MEM_ERROR if memory could not be   allocated for processing, Z_DATA_ERROR if the deflate data is   invalid or incomplete, Z_VERSION_ERROR if the version of zlib.h and   the version of the library linked do not match, or Z_ERRNO if there   is an error reading or writing the files. */int inf(FILE *source, FILE *dest){    int ret;    unsigned have;    z_stream strm;    char in[CHUNK];    char out[CHUNK];    /* allocate inflate state */    strm.zalloc = Z_NULL;    strm.zfree = Z_NULL;    strm.opaque = Z_NULL;    strm.avail_in = 0;    strm.next_in = Z_NULL;    ret = inflateInit(&strm);    if (ret != Z_OK)        return ret;    /* decompress until deflate stream ends or end of file */    do {        strm.avail_in = fread(in, 1, CHUNK, source);        if (ferror(source)) {            (void)inflateEnd(&strm);            return Z_ERRNO;        }        if (strm.avail_in == 0)            break;        strm.next_in = in;        /* run inflate() on input until output buffer not full */        do {            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 ret;            }            have = CHUNK - strm.avail_out;            if (fwrite(out, 1, have, dest) != have || ferror(dest)) {                (void)inflateEnd(&strm);                return Z_ERRNO;            }        } while (strm.avail_out == 0);        /* done when inflate() says it's done */    } while (ret != Z_STREAM_END);    /* clean up and return */    (void)inflateEnd(&strm);    return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;}/* report a zlib or i/o error */void zerr(int ret){    fputs("zpipe: ", stderr);    switch (ret) {    case Z_ERRNO:        if (ferror(stdin))            fputs("error reading stdin\n", stderr);        if (ferror(stdout))            fputs("error writing stdout\n", stderr);        break;    case Z_STREAM_ERROR:        fputs("invalid compression level\n", stderr);        break;    case Z_DATA_ERROR:        fputs("invalid or incomplete deflate data\n", stderr);        break;    case Z_MEM_ERROR:        fputs("out of memory\n", stderr);        break;    case Z_VERSION_ERROR:        fputs("zlib version mismatch!\n", stderr);    }}/* compress or decompress from stdin to stdout */int main(int argc, char **argv){    int ret;    FILE *filein, *fileout;    if((filein = fopen(argv[1], "rb")) == NULL)    {        printf("Can\'t open %s!\n", argv[1]);        return -1;    }    if((fileout = fopen(argv[2], "wb")) == NULL)    {        printf("Can\'t open %s!\n", argv[1]);        return -1;    }    /* do compression if no arguments */    if (argc == 3) {        ret = def(filein, fileout, Z_DEFAULT_COMPRESSION);        if (ret != Z_OK)            zerr(ret);        return ret;    }    /* do decompression if -d specified */    else if (argc == 4 && strcmp(argv[3], "-d") == 0) {        ret = inf(filein, fileout);        if (ret != Z_OK)            zerr(ret);        return ret;    }    /* otherwise, report usage */    else {        fputs("zpipe usage: zpipe (source) (dest) [-d] \n", stderr);        return 1;    }}

Compile

gcc -g -o zpipe zpipe.c -lz

Run

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.