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

C++

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

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

02.02.2010, 23:42. Просмотров 1658. Ответов 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++):

Хаффман и не правильное разархивирование - C++
Я уже долго работаю с кодировкой методом Хаффмана...сделано много(для меня), и вот: он уже строит дерево, архивирует файл, но...

Возможно ли реализовать с помощью C++ Builder разархивирование файлов .rar - C++ Builder
Возможно ли реализовать в C++ Builder программу, которая разархивировала бы файлы, заархивированные программой WinRar, для дальнейшей их...

Как пользоваться Zlib'om - C++ Builder
Скачал 1.2.8 версию с сайта для Delphi провел .pas через билдера, получил .hpp Подключаю: #include &quot;ZLibEx.hpp&quot; #include...

Как подкючить библиотеку zlib к C++ builder 2010 - C++ Builder
как подкючить библиотеку zlib если у меня C++ builder 2010??

Выполнить архивирование и поставить выполнение задачи в расписание - C++ Builder
Здраствуйте помогите пожалуйста решить задачку в билдере с++. Нужно выпонить архивирование (например c c:\temp\*.* на d:\ ) и поставить...

Выпонить архивирование и поставить выполнение задачи в расписание - C++ Builder
Здраствуйте помогите пожалуйста решить задачку в билдере с++. Нужно выпонить архивирование (например c c:\temp\*.* на d:\ ) и...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.02.2010, 23:42
Привет! Вот еще темы с ответами:

Двойное условие - C++ Builder
Доброго времени суток. Возникла такая проблема. Не могу сообразить как синтаксически правильно объединить два условия в одно. Ниже условия ...

ListBox->Items двойное нажатие? - C++ Builder
Как сделать что бы при двойном нажатии на Item Листбокса выполнялось какое-либо действие?

Двойное рисовании линии на канве - C++ Builder
По всем законам (в ДОСовской BGI графике это работало) двойное проведение линии на канве в моде pmXor ее уничтожает и появится исходное...

Архивирование и разархивирование ZIP архивов - Visual C++
Здравствуйте! Долго уже ищу, но не могу найти подходящего. Пробовал zLib - ничего не понял даже по примерам. В LZMA вообще...


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

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