Юзаем Compress() / DeCompress() в C91
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Юзаем Compress() / DeCompress() в C91
Привет всем !
Кто-нибудь пробовал работать с встроенными функциями Compress() / DeCompress() в C91 ?
Я попробовал с их помощью написать простую упаковку / распаковку файла и столкнулся с одной непонятной странностью.
Loc:BufferUnPack &String
Loc:BufferPack &String
Loc:Result Long
Code
DeCompress(Loc:BufferUnPack,Loc:BufferPack,Loc:Result)
упорно возвращает Loc:Result = -2 (Stream error), до тех пор пока перед распаковкой явно не будет
задан размер выходного буфера: Loc:BufferUnPack &= New(String(Размер распакованного файла)),
чего судя по описанию и примерам делать не надо ...
Да и здравая логика хромает - откуда я знаю какой размер будет иметь распакованный архив ?!
В принципе проблему решил - все работает. Дописал 10 байт с размером несжатого файла в хвост архива,
и объявлением строки под этот размер при распаковке, но осталось ощущение, что что-то здесь не так ...
Кто-нибудь пробовал работать с встроенными функциями Compress() / DeCompress() в C91 ?
Я попробовал с их помощью написать простую упаковку / распаковку файла и столкнулся с одной непонятной странностью.
Loc:BufferUnPack &String
Loc:BufferPack &String
Loc:Result Long
Code
DeCompress(Loc:BufferUnPack,Loc:BufferPack,Loc:Result)
упорно возвращает Loc:Result = -2 (Stream error), до тех пор пока перед распаковкой явно не будет
задан размер выходного буфера: Loc:BufferUnPack &= New(String(Размер распакованного файла)),
чего судя по описанию и примерам делать не надо ...
Да и здравая логика хромает - откуда я знаю какой размер будет иметь распакованный архив ?!
В принципе проблему решил - все работает. Дописал 10 байт с размером несжатого файла в хвост архива,
и объявлением строки под этот размер при распаковке, но осталось ощущение, что что-то здесь не так ...
За теми кто отстал - не возвращаться. (С) Кодекс
Re: Юзаем Compress() / DeCompress() в C91
Пользовался zlib.dll там дописывалось в начале архива еще и признак того что это вообще упаковывалось , 12 байт хватит .
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Re: Юзаем Compress() / DeCompress() в C91
Ну в файле builtins.clw есть описание прототипов этих встроенных функций:
Так, что это тот же ZLIB, только встроенный в runtime Clarion.
В принципе, наверное, можно попробовать написать через эти функции полноценную работу с ZIP архивами.
И кстати я проверял на нескольких наборах файлов - степень сжатия как у ZIP (и процентов на 20 хуже RAR / 7zip)
Код: Выделить всё
COMPRESS (*STRING srcBuf, SIGNED level = -1, <*SIGNED result>),*STRING,NAME('Cla$zlibCompress')
DECOMPRESS (*STRING destBuf, *STRING srcBuf, <*SIGNED result>),NAME('Cla$zlibDecompress')
В принципе, наверное, можно попробовать написать через эти функции полноценную работу с ZIP архивами.
И кстати я проверял на нескольких наборах файлов - степень сжатия как у ZIP (и процентов на 20 хуже RAR / 7zip)
За теми кто отстал - не возвращаться. (С) Кодекс
Re: Юзаем Compress() / DeCompress() в C91
Это не тот Compress-Decompress, в Zip-архивах пользуются другими функциями.
А кларионовский класс для упаковки-распаковки Zip есть, и даже не один.
А кларионовский класс для упаковки-распаковки Zip есть, и даже не один.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Re: Юзаем Compress() / DeCompress() в C91
Да я знаю, но мне известны только варианты с использованием сторонней DLL.Yufil писал(а):А кларионовский класс для упаковки-распаковки Zip есть, и даже не один.
Или существуют варианты без использования DLL ?
За теми кто отстал - не возвращаться. (С) Кодекс
Re: Юзаем Compress() / DeCompress() в C91
Я о том, что модули Clarun из 9.1 не экспортируют функций работы с zip. А в чём проблемы с DLL, если поискать - можно найти программы, собирающие exe из пачки exe + dll + activex + ...
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Re: Юзаем Compress() / DeCompress() в C91
Абсолютно согласен. Я написал, про то, что описание NAME('Cla$zlibCompress') указывает на то, что без ZLIB здесь не обошлось.Yufil писал(а):Я о том, что модули Clarun из 9.1 не экспортируют функций работы с zip.
К тому же функция Compress() используется для упаковки при генерации PDF, а значит скорее всего у нее формат упаковки именно ZIP.
За теми кто отстал - не возвращаться. (С) Кодекс
-
- ✯ Ветеран ✯
- Сообщения: 4983
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 20 раз
Re: Юзаем Compress() / DeCompress() в C91
По хелпу всё логично. Компрессия / декомпрессия делается в буфере, поэтому нужно знать размер этого буфера. Могу ли я задать в Clarion'е переменную неопределённого размера. По-моему не могу. И, видимо, отсюда ограничения. Кажется, в Си можно такое делать, задать переменную типа CHAR без объявления размера (могу ошибаться, давно это было). Кстати, а нет нормальной обвязки для этих функций? Как правило упаковывать нужно файлы, поэтому неплохо класс какой-нибудь иметь для этого.
We are hard at work… for you.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Re: Юзаем Compress() / DeCompress() в C91
Ты не прав. Посмотри использование Compress() / DeCompress(), например в SystemString.clwkreator писал(а):По хелпу всё логично. Компрессия / декомпрессия делается в буфере, поэтому нужно знать размер этого буфера.
Это просто работа с указателями. Вот абсолютно рабочий код на Clarion:
Код: Выделить всё
Loc:xBuffer &String
Loc:xResult Long
Code
Loc:xBuffer &= Compress(Loc:МуUnPackString,-1,Loc:xResult)
Я не определяю размер буфера для архивированной строки, а получаю указатель на строку и ее размер. Здесь все четко.
Проблема как раз в том, что эта же схема не работает с DeCompress() !
Хотя схема должна быть та же самая (и в примерах так !): передал указатель, получил адрес строки и ее размер.
Но нет - пока не объявишь размер выходного буфера DeCompress() не работает. см. мое первое сообщение в этой теме.
За теми кто отстал - не возвращаться. (С) Кодекс
Re: Юзаем Compress() / DeCompress() в C91
У меня есть классы для работы с динамическими строками
S Cstr
...
S.LoadFromFile('myfile.txt')
S.SaveToBlob(*Blob)
...
Есть функции для упаковки блобов через Zlib PackBlob(*Blob) и UnpackBlob(*Blob)
Есть классы для упаковки-распаковки Zip через Zlib, правда, всё достаточно древнее, не поддерживает шифрованные и длинные файлы.
Это всё достаточно старое. Но работает, вроде
S Cstr
...
S.LoadFromFile('myfile.txt')
S.SaveToBlob(*Blob)
...
Есть функции для упаковки блобов через Zlib PackBlob(*Blob) и UnpackBlob(*Blob)
Есть классы для упаковки-распаковки Zip через Zlib, правда, всё достаточно древнее, не поддерживает шифрованные и длинные файлы.
Это всё достаточно старое. Но работает, вроде
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Re: Юзаем Compress() / DeCompress() в C91
И у меня есть. Скорее всего - твои.Yufil писал(а):У меня есть классы для работы с динамическими строками
Сам когда-то тоже писал упаковку файлов с документами перед записью в BLOB, но использовал функции сжатия библиотеки Catalyst SocketTools.
Там более мощные алгоритмы, чем ZIP. Минус все-тот же: внешний и древний DLL.
Заморачиваться с упаковщиками EXE не хочется - и так антивирусы нервно реагируют, если в программе есть вызовы функций CryptoApi или INet ...
Compress() / DeCompress() в C91 - прекрасный механизм для упаковки данных, просто работает местами странно. Впрочем как и многое другое в Clarion.
За теми кто отстал - не возвращаться. (С) Кодекс
- Дед Пахом
- Старичок
- Сообщения: 3133
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 10 раз
- Поблагодарили: 28 раз
- Контактная информация:
Re: Юзаем Compress() / DeCompress() в C91
Не зря COMPRESS и DECOMPRESS отличаются в декларациях...
Хотел посмотреть, как они работают в SystemString, да не тут-то было! Программа валится на первой строчке, если объявлена переменная типа SystemString. Нужные прагмы вроде на месте:
PRAGMA('project(#pragma define(_ABCDllMode_ => 0))')
PRAGMA('project(#pragma define(_ABCLinkMode_ => 1))')
C9.1.11129
Хотел посмотреть, как они работают в SystemString, да не тут-то было! Программа валится на первой строчке, если объявлена переменная типа SystemString. Нужные прагмы вроде на месте:
PRAGMA('project(#pragma define(_ABCDllMode_ => 0))')
PRAGMA('project(#pragma define(_ABCLinkMode_ => 1))')
C9.1.11129
С уважением, ДП
- Дед Пахом
- Старичок
- Сообщения: 3133
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 10 раз
- Поблагодарили: 28 раз
- Контактная информация:
Re: Юзаем Compress() / DeCompress() в C91
работает, если вместо явных PRAGMA то же самое вписать в свойствах проекта. Ну не в этом суть, суть в том, что метод SystemString.Decompress() не работает по той же причине - ошибка -2.
С уважением, ДП
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Re: Юзаем Compress() / DeCompress() в C91
Ура ! Не у меня одного ... Мне все-таки кажется это очередной ляп SV.Дед Пахом писал(а):Ну не в этом суть, суть в том, что метод SystemString.Decompress() не работает по той же причине - ошибка -2.
За теми кто отстал - не возвращаться. (С) Кодекс