Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
insideone
Модератор
Автор FAQ
3636 / 914 / 49
Регистрация: 10.01.2010
Сообщений: 2,464
#1

zlib Двойное архивирование\разархивирование - C++

02.02.2010, 23:42. Просмотров 1653. Ответов 0
Метки нет (Все метки)

Использую библиотеку zlib 1.2.3
Нужно сохранять массив объектов в файл и потом загружать её. Вес - 10 мегабайт. Решил сжать перед записью. Сделал... обнаружил что уже сжатый файл тоже бы мог сжаться хорошенько (60кб). Сжал кое как... получил 6кб. Отлично... Пытаюсь разжать дважды. Что то выходит, однако тест загруженого массива объектов в реальной программе показывает баги (этот массив используется для того чтобы рендер понимал что рисовать на экране).

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
void SaveData(const char* FileName, void* Data, unsigned long Size)
{
    unsigned long CompressedSize = Size + 0.1*Size + 24;
    unsigned char* BufferOne = new unsigned char[CompressedSize];
    compress(BufferOne, &CompressedSize, (const Bytef *)Data, Size);
 
    Size = CompressedSize;
    CompressedSize = CompressedSize + 0.1*CompressedSize + 24;
    unsigned char* BufferTwo = new unsigned char[CompressedSize];
    compress(BufferTwo, &CompressedSize, (const Bytef *)BufferOne, Size);
 
    std::ofstream os(FileName, std::ios::binary);
    os.write(reinterpret_cast<const char*>(BufferTwo),CompressedSize);
    os.close();
 
    delete[] BufferOne;
    delete[] BufferTwo;
}
 
void LoadData(const char* FileName, void* Data, unsigned long Size)
{
    // Фаил открывается на чтение
    HANDLE hFile=CreateFile(FileName,GENERIC_ALL,3,(LPSECURITY_ATTRIBUTES) NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,(HANDLE)NULL);
    DWORD FileSize=GetFileSize(hFile,0);
    CloseHandle(hFile);
 
    std::ifstream is(FileName, std::ios::binary);
    is.read(reinterpret_cast<char*>(Data),Size);
 
    // Предпологаемый размер разархивированых данных
    // Берем чуть больше чем размер структуры в которую загружаем
    // на всякий случай
    unsigned long UncompressedSize = Size + Size * 0.1;
    Bytef* Buffer = new Bytef[UncompressedSize];
    uncompress(Buffer, &UncompressedSize, (const Bytef *)Data, FileSize);
 
    uncompress((Bytef*)Data, &Size, Buffer, UncompressedSize);
 
    is.close();
 
    delete [] Buffer;
}
Если кто то работал с zlib... может я что то не так делаю?

Добавлено через 32 минуты
Вопрос снимается. Рендеру нужны были ещё кое какие данные для полного переноса информации этого массива объектов... Код рабочий Странно что после первого сжатия такое... наверное алгоритм не очень хороший... а то я себе прям так и представляю в сети все бы выкладывали архив в архив и так матрешка до 30 вложений
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.02.2010, 23:42     zlib Двойное архивирование\разархивирование
Посмотрите здесь:

Возможно ли реализовать с помощью C++ Builder разархивирование файлов .rar C++ Builder
Хаффман и не правильное разархивирование C++
Использование Zlib C++
C++ Api zlib
C++ zlib метод\уровень сжатия
C++ ZLib
Как пользоваться Zlib'om C++ Builder
C++ Установка библиотеки zlib
Архивирование и разархивирование ZIP архивов Visual C++
C++ Не получается расшифровать zlib
Как распаковать архив ZLib C++ C++
C++ Что делать с Zlib?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru