![]() |
|
|
![]()
|
|
| WolfAlone |
|
|||
![]() В экстазе ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1010 Регистрация: 16.9.2008 Где: Рай Репутация: нет Всего: 5 |
Доброго времени суток!
Помогите пожалуйста решить следующую задачу: Имеется некоторый поток в памяти (TMemoryStream), в котором содержиться, некоторые данные, достуим строка "AAAAAAAAAA". Необходимо сжать данные в этом потоке, и полученный результат (после сжатия) пометстить в другой поток (TMemoryStream). Чем (каким алгоритмом) сжимать/разживать значения не имеет. ZIP, GZip и т.п. - не принципиально вообще. Главное, провести процедулу "архивации" над данными в памяти и полученный результат записать в другой поток, для возможности дальнейших манипуляций с ним. В идеале - хотелось бы найти готовый модуль или библиотеку, для подключения в программу с целью дальнейшего использования, т.к. используется Turbo C++ Explorer, который не подразумевает установку каких-либо стронних компонентов. Подскажите пожалуйста, возможные решения. -------------------- И сказал Бог: "Тогда я построю свой мир с блэк-джеком и шлюхами!" Ф топку Ubuntu, Debian наше фсё! (с) Евгений Вольф |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
Стандартный класс TCompressionStream
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| WolfAlone |
|
|||
![]() В экстазе ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1010 Регистрация: 16.9.2008 Где: Рай Репутация: нет Всего: 5 |
Alexeis, судя по всему, TCompressionStream работает исключительно с файловыми потоками и никоим образом не хочет паковать "память"...
Это сообщение отредактировал(а) WolfAlone - 25.3.2012, 00:16 -------------------- И сказал Бог: "Тогда я построю свой мир с блэк-джеком и шлюхами!" Ф топку Ubuntu, Debian наше фсё! (с) Евгений Вольф |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
А судя по документации
нет, и судя по опыту тоже нет. Работает с любыми потоками. Просто внимательно нужно посмотреть что куда передавать и сдвигать указатель на данные в ноль. Некоторые операции производятся от текущей позиции в памяти. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| WolfAlone |
|
|||
![]() В экстазе ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1010 Регистрация: 16.9.2008 Где: Рай Репутация: нет Всего: 5 |
Подскажите пожалуйста, почему при использовании TCompressionStream, при сжатии маленьких файлов (точно размер файла, который можно назвать "маленьким" сказать не могу) - результат сжатия поток размером в 0 байт, а при сжатии больших файлов - всё работает нормально?
Подробности: Для тестов, взял копии тех файлов, что лежат в папке: "Debug_build", в частности, следующие файлы (их копии! блокировки на чтение нет!) 1. "Маленький файл": "project.obj", размер: 52Кб 2. "Большой файл": "project.tds", размер около 3.5Мб Я долго и упорно искал свою ошибку, но потом пришел к выводу, что кроме имени файла, я в коде не меняю ничего, а результат абсолютно разный. А именно: При сжатии "маленького файла", выходной файл получается 0 байт, при сжатии "большого файла", выходной файл получается: ~800Кб. Вообще, операции должны проходить над данными в TMemoryStream, но в целях отладки (тестов), я копирую в TMemoryStream данные из TFileStream. Собственно, код:
Это сообщение отредактировал(а) WolfAlone - 25.3.2012, 01:27 -------------------- И сказал Бог: "Тогда я построю свой мир с блэк-джеком и шлюхами!" Ф топку Ubuntu, Debian наше фсё! (с) Евгений Вольф |
|||
|
||||
| Alexeis |
|
||||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
Дело в буферизации. Маленькие объемы не пожмутся сразу.
После delete compressor; все данные успешно пожались и перешли в comprdata . -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||
|
|||||
| WolfAlone |
|
|||
![]() В экстазе ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1010 Регистрация: 16.9.2008 Где: Рай Репутация: нет Всего: 5 |
Alexeis, как-то я над этим не подумал... Спасибо огромное! Остались последние штрихи.
Подскажите пожалуйста, есть ли какой-то способ сбросить буфер без удаления самого потока? Перерыл всю справку, что-то наподобии flush();, так и не нашёл. И самое главное - нигде не могу найти пример, как обработать т.н. "прогресс", то есть, как повесить обработчик на событие TCompressionStream::OnProgress. Перерыл весь интернет, справку и всё, что попадало под руку. Примеры либо для Delphi, либо их нет вообще... Даже Google молчит! Подскажите пожалуйста, простейший пример обработки этого события? -------------------- И сказал Бог: "Тогда я построю свой мир с блэк-джеком и шлюхами!" Ф топку Ubuntu, Debian наше фсё! (с) Евгений Вольф |
|||
|
||||
| Alexeis |
|
||||||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
Нету там такого, только если унаследовать класс и вызывать функцию deflate руками задав параметр сжать без кеша.
В классе вызывается deflate с параметром Z_NO_FLUSH, т.е. по умолчанию кэширование. Вероятно нужно вызвать с параметром Z_FULL_FLUSH . На счет прогресса тут видимо нужно следить за изменением позиции в потока куда сливаются данные.
раз авторы кода считывают FStreamPos := FStream.Position; , то вероятно оно меняется после каждой операции сжатия. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||||
|
|||||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |