Skip to content

Instantly share code, notes, and snippets.

@arq5x
Last active November 30, 2023 12:50
Show Gist options
  • Save arq5x/5315739 to your computer and use it in GitHub Desktop.
Save arq5x/5315739 to your computer and use it in GitHub Desktop.
Compress and then Decompress a string with zlib.
# compile
$ g++ zlib-example.cpp -lz -o zlib-example
# run
$ ./zlib-example
Uncompressed size is: 36
Uncompressed string is: Hello Hello Hello Hello Hello Hello!
----------
Compressed size is: 13
Compressed string is: x��H���W��G*2
----------
Uncompressed size is: 36
Uncompressed string is: Hello Hello Hello Hello Hello Hello!
#include <stdio.h>
#include <string.h> // for strlen
#include <assert.h>
#include "zlib.h"
// adapted from: http://stackoverflow.com/questions/7540259/deflate-and-inflate-zlib-h-in-c
int main(int argc, char* argv[])
{
// original string len = 36
char a[50] = "Hello Hello Hello Hello Hello Hello!";
// placeholder for the compressed (deflated) version of "a"
char b[50];
// placeholder for the UNcompressed (inflated) version of "b"
char c[50];
printf("Uncompressed size is: %lu\n", strlen(a));
printf("Uncompressed string is: %s\n", a);
printf("\n----------\n\n");
// STEP 1.
// deflate a into b. (that is, compress a into b)
// zlib struct
z_stream defstream;
defstream.zalloc = Z_NULL;
defstream.zfree = Z_NULL;
defstream.opaque = Z_NULL;
// setup "a" as the input and "b" as the compressed output
defstream.avail_in = (uInt)strlen(a)+1; // size of input, string + terminator
defstream.next_in = (Bytef *)a; // input char array
defstream.avail_out = (uInt)sizeof(b); // size of output
defstream.next_out = (Bytef *)b; // output char array
// the actual compression work.
deflateInit(&defstream, Z_BEST_COMPRESSION);
deflate(&defstream, Z_FINISH);
deflateEnd(&defstream);
// This is one way of getting the size of the output
printf("Compressed size is: %lu\n", strlen(b));
printf("Compressed string is: %s\n", b);
printf("\n----------\n\n");
// STEP 2.
// inflate b into c
// zlib struct
z_stream infstream;
infstream.zalloc = Z_NULL;
infstream.zfree = Z_NULL;
infstream.opaque = Z_NULL;
// setup "b" as the input and "c" as the compressed output
infstream.avail_in = (uInt)((char*)defstream.next_out - b); // size of input
infstream.next_in = (Bytef *)b; // input char array
infstream.avail_out = (uInt)sizeof(c); // size of output
infstream.next_out = (Bytef *)c; // output char array
// the actual DE-compression work.
inflateInit(&infstream);
inflate(&infstream, Z_NO_FLUSH);
inflateEnd(&infstream);
printf("Uncompressed size is: %lu\n", strlen(c));
printf("Uncompressed string is: %s\n", c);
// make sure uncompressed is exactly equal to original.
assert(strcmp(a,c)==0);
return 0;
}
@pnhathung
Copy link

Your length of array should be 51.

@jasonchristopherchandra

does this run on windows ?

@shaheerakr
Copy link

when i am running this code this in giving me this error
error C2275: 'z_stream' : illegal use of this type as an expression

@denisdemaisbr
Copy link

be ware using strlen() with binary data

// defstream.avail_in = (uInt)strlen(a)+1;

@daarisameen
Copy link

How to execute these programs in windows

@daarisameen
Copy link

does this run on windows ?

no ig

@stefanasandei
Copy link

stefanasandei commented Aug 3, 2021

How to execute these programs in windows

install windows subsystem for linux and run the code from the linux environment

@HarikrishnaR-OPTM
Copy link

Input File: file size: 52946 Aug 23 17:23 RGB_16bits_palette_sample_image.png
Output Comp File: file size: 52972 Aug 23 17:35 zlib_comp_16bits.j2k
Output DeComp File: file size: 52946 Aug 23 17:35 zlib_decomp_16bits.png

Why the output Compressed file size becoming greater then the ( 52972 > 52946) Input file size ?

@denisdemaisbr
Copy link

It's normal.
recompressing data almost always increases the size.

@SirObby
Copy link

SirObby commented Nov 17, 2021

Is this possible without the array length? like instead of [90] we could have []?

@halloweeks
Copy link

Yes. without array length
use const char* myvar;

@anasouardini-old
Copy link

anasouardini-old commented Apr 30, 2022

How do I use this dynamically without knowing the output size, (when decompressing)

@mcfriend99
Copy link

@anasouardini Did you find any answer?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment