-
-
Save sakishum/26ced46a715c6e192c5618adcbd21641 to your computer and use it in GitHub Desktop.
Compress and then Decompress a string with zlib.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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! |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment