GZIP-упаковка/распаковка в памяти Nov 25, 2008

Для выполнения операций упаковки/распаковки данных прямо в памяти, можно использовать бесплатную библиотеку zlib (формат получаемых данных совместим с gzip).

Ниже приведён исходный текст, демонстрирующий, как это можно сделать.

#include "stdafx.h"
#include "stdio.h"
// подключаем zlib в виде dll
#define zlib_dll 1
#include "gzip/GZipHelper.h"
#pragma comment(lib, "gzip/zlib.lib")
//////////////////////////////////////////////////////////////////////////
// функция для упаковки буфера
template<typename T>
T *zlib_compress(T *buf, dword size, dword *result_size = 0)
{
    CA2GZIPT<65536, z_best_compression, z_default_strategy> gzip(reinterpret_cast<char*>(buf), size);
    if (result_size)
        *result_size = gzip.length;
    return reinterpret_cast<T*>(gzip.pgzip);
}

// функция для распаковки буфера,
template<typename T>
T *zlib_uncompress(T *buf, dword size, dword *result_size=null)
{
    cgzip2a plain((byte*)buf, size);
    if (result_size)
        *result_size = plain.length;
    return plain.psz;
}

//////////////////////////////////////////////////////////////////////////
int main(int argc, char* argv[])
{
    // открываем тестовый файл, определяем его размер
    file *f = fopen("test.txt", "r");
    if (!f) return 1;
    fseek(f, 0, seek_end);
    dword size = ftell(f);
    fseek(f, 0, seek_set);
    // выделяем область памяти для текста из файла, читаем файл
    char *text = new char[size ];
    fread(text, size, 1, f);
    fclose(f);
    // упаковываем текст gzip-ом
    dword comp_size;
    char *compressed = zlib_compress(text, size, &comp_size);
    // распаковываем
    dword uncomp_size;
    char *uncompressed = zlib_uncompress(compressed, comp_size, &uncomp_size);
    // выводим результаты... Впечатляет !
    printf("source string: %d bytes\n", size);
    printf("packed string: %d bytes\n", comp_size);
    printf("unpacked string: %d bytes\n", uncomp_size);
    // наслаждаемся результатом smile.gif...
    while (1);
    return 0;
}

Взято отсюда.