-
-
Save arq5x/5315739 to your computer and use it in GitHub Desktop.
# 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; | |
} |
does this run on windows ?
no ig
How to execute these programs in windows
install windows subsystem for linux and run the code from the linux environment
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 ?
It's normal.
recompressing data almost always increases the size.
Is this possible without the array length? like instead of [90]
we could have []
?
Yes. without array length
use const char* myvar;
How do I use this dynamically without knowing the output size, (when decompressing)
@anasouardini Did you find any answer?
How to execute these programs in windows