Юзаем Compress() / DeCompress() в C91

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию 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 байт с размером несжатого файла в хвост архива,
и объявлением строки под этот размер при распаковке, но осталось ощущение, что что-то здесь не так ... :(
За теми кто отстал - не возвращаться. (С) Кодекс
BOB
Ветеран
Сообщения: 336
Зарегистрирован: 17 Июль 2005, 5:43

Re: Юзаем Compress() / DeCompress() в C91

Сообщение BOB »

Пользовался zlib.dll там дописывалось в начале архива еще и признак того что это вообще упаковывалось , 12 байт хватит .
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Re: Юзаем Compress() / DeCompress() в C91

Сообщение Игорь Столяров »

Ну в файле builtins.clw есть описание прототипов этих встроенных функций:

Код: Выделить всё

COMPRESS (*STRING srcBuf, SIGNED level = -1, <*SIGNED result>),*STRING,NAME('Cla$zlibCompress')
DECOMPRESS (*STRING destBuf, *STRING srcBuf, <*SIGNED result>),NAME('Cla$zlibDecompress')
Так, что это тот же ZLIB, только встроенный в runtime Clarion.
В принципе, наверное, можно попробовать написать через эти функции полноценную работу с ZIP архивами.
И кстати я проверял на нескольких наборах файлов - степень сжатия как у ZIP (и процентов на 20 хуже RAR / 7zip)
За теми кто отстал - не возвращаться. (С) Кодекс
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: Юзаем Compress() / DeCompress() в C91

Сообщение Yufil »

Это не тот Compress-Decompress, в Zip-архивах пользуются другими функциями.
А кларионовский класс для упаковки-распаковки Zip есть, и даже не один.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Re: Юзаем Compress() / DeCompress() в C91

Сообщение Игорь Столяров »

Yufil писал(а):А кларионовский класс для упаковки-распаковки Zip есть, и даже не один.
Да я знаю, но мне известны только варианты с использованием сторонней DLL.
Или существуют варианты без использования DLL ?
За теми кто отстал - не возвращаться. (С) Кодекс
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: Юзаем Compress() / DeCompress() в C91

Сообщение Yufil »

Я о том, что модули Clarun из 9.1 не экспортируют функций работы с zip. А в чём проблемы с DLL, если поискать - можно найти программы, собирающие exe из пачки exe + dll + activex + ...
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: Юзаем Compress() / DeCompress() в C91

Сообщение Yufil »

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Re: Юзаем Compress() / DeCompress() в C91

Сообщение Игорь Столяров »

Yufil писал(а):Я о том, что модули Clarun из 9.1 не экспортируют функций работы с zip.
Абсолютно согласен. Я написал, про то, что описание NAME('Cla$zlibCompress') указывает на то, что без ZLIB здесь не обошлось.
К тому же функция Compress() используется для упаковки при генерации PDF, а значит скорее всего у нее формат упаковки именно ZIP.
За теми кто отстал - не возвращаться. (С) Кодекс
kreator
✯ Ветеран ✯
Сообщения: 4983
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 20 раз

Re: Юзаем Compress() / DeCompress() в C91

Сообщение kreator »

По хелпу всё логично. Компрессия / декомпрессия делается в буфере, поэтому нужно знать размер этого буфера. Могу ли я задать в Clarion'е переменную неопределённого размера. По-моему не могу. И, видимо, отсюда ограничения. Кажется, в Си можно такое делать, задать переменную типа CHAR без объявления размера (могу ошибаться, давно это было). Кстати, а нет нормальной обвязки для этих функций? Как правило упаковывать нужно файлы, поэтому неплохо класс какой-нибудь иметь для этого.
We are hard at work… for you. :)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Re: Юзаем Compress() / DeCompress() в C91

Сообщение Игорь Столяров »

kreator писал(а):По хелпу всё логично. Компрессия / декомпрессия делается в буфере, поэтому нужно знать размер этого буфера.
Ты не прав. Посмотри использование Compress() / DeCompress(), например в SystemString.clw
Это просто работа с указателями. Вот абсолютно рабочий код на Clarion:

Код: Выделить всё

Loc:xBuffer    &String
Loc:xResult    Long

  Code

   Loc:xBuffer &= Compress(Loc:МуUnPackString,-1,Loc:xResult)
После выполнения архивирования, Compress() возвращает указатель на строку c сжатыми данными и ее размер в Loc:xResult.
Я не определяю размер буфера для архивированной строки, а получаю указатель на строку и ее размер. Здесь все четко.

Проблема как раз в том, что эта же схема не работает с DeCompress() !
Хотя схема должна быть та же самая (и в примерах так !): передал указатель, получил адрес строки и ее размер.
Но нет - пока не объявишь размер выходного буфера DeCompress() не работает. :( см. мое первое сообщение в этой теме.
За теми кто отстал - не возвращаться. (С) Кодекс
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: Юзаем Compress() / DeCompress() в C91

Сообщение Yufil »

У меня есть классы для работы с динамическими строками
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
С уважением, ДП
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 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

Сообщение Игорь Столяров »

Дед Пахом писал(а):Ну не в этом суть, суть в том, что метод SystemString.Decompress() не работает по той же причине - ошибка -2.
Ура ! Не у меня одного ... :) Мне все-таки кажется это очередной ляп SV.
За теми кто отстал - не возвращаться. (С) Кодекс
Ответить