Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / Languages / C++

The Compression API: It was about time

4.67/5 (7 votes)
16 Feb 2015CPOL1 min read 28.8K   483  
The ability to compress/decompress data in Win32

Introduction

I guess it is too late, but they finally put it. A compression/decompression api in windows which is easy to use. And, with my class, even easier.

Background

The API is a simple set of functions that allow compression or decompression of data.  Windows supports a number of algorithms (https://msdn.microsoft.com/en-us/library/windows/desktop/hh920921(v=vs.85).aspx) which we can select in our constructor. Windows also supports block-mode, if you want to control the compressor, which is not a feature in our quick class.

Because the API exists only in Windows 8, all our class calls are dynamic (incidentally, the call uses the template from my One-Line call article) . You can check the static member COMPRESSIONAPI::Available() to see if the API is available.  If the API is not available, constructing the object will throw.

Using the code

 

C++
//
    if (!COMPRESSIONAPI::Available())
        BlowThisPC(); // :)
   
    COMPRESSIONAPI c(COMPRESS_ALGORITHM_LZMS);
   
    vector<char> x;
    x.resize(10000);
    strcpy_s(x.data(),10000,"Hello there");
   
    vector<char> rs;
    c.Compress(x.data(),10000,rs);

    vector<char> rs2;
    c.Decompress(rs.data(),rs.size(),rs2);

//

 

Easy. You have the constructor (which specifies the compression algorithm, in this case COMPRESS_ALGORITHM_LZMS.  Then you have 2 member functions, Compress and Decompress. Both take the buffer to work on, it's size, and a vector<char> to put the result. They return S_OK on success and E_FAIL on error.

Internally, my class tests the API in order to find out the exact size neeeded for the buffer. 

History

16 - 2 - 2015 : First Release

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)