Обсуждение статьи "Работаем с ZIP-архивами средствами MQL5 без использования сторонних библиотек"

 

Опубликована статья Работаем с ZIP-архивами средствами MQL5 без использования сторонних библиотек:

Язык MQL5 развивается, и в него постоянно добавляются новые функции для работы с данными. С некоторых пор, благодаря нововведениям, стало возможно работать с ZIP-архивами штатными средствами MQL5 без привлечения сторонних библиотек DLL. Данная статья подробно описывает, как это делается, на примере описания класса CZip — универсального инструмента для чтения, создания и модификации ZIP-архивов.

Однажды автора данной статьи привлекла интересная особенность функции CryptDecode, а именно — возможность распаковывать переданный ей ZIP-массив. Этот модификатор был введен разработчиками торговой платформы MetaTrader 5 для того, чтобы можно было распаковывать ответ некоторых серверов, используя стандартную функцию WebRequest. Однако из-за некоторых особенностей формата ZIP-файла, использовать ее напрямую было невозможно.

Требовалась дополнительная аутентификация: для распаковки архива необходимо знать его хеш-сумму до упаковки: Adler-32, которой, естественно, не было. Однако, при обсуждении этой проблемы, разработчики пошли навстречу и перегрузили CryptDecode и CryptEncode, ее зеркального близнеца, специальным флагом, игнорирующим хеш Adler32 при распаковке переданных данных. Для неискушенных в техническом плане пользователей это нововведение можно объяснить просто: благодаря ему стала возможной полнофункциональная работа с ZIP-архивами. Эта статья подробно описывает формат ZIP-файла, особенности хранения данных в нем и предлагает для работы с архивом удобный объектно-ориентированный класс CZip.

Каждый ZIP-архив — это бинарный файл, содержащий упорядоченную последовательность байтов. С другой стороны, в ZIP-архиве каждый файл имеет имя, атрибуты (например время модификации файла) и другие свойства, которые мы привыкли видеть в файловой системе любой операционной системы. Поэтому, помимо запакованных данных, каждый ZIP-архив хранит имя запакованного файла, его атрибуты и другую служебную информацию. Эта служебная информация располагается в строго определенном порядке и имеет регулярную структуру. Например, если в архиве содержатся два файла (File#1 и File#2), то архив будет иметь следующую схему:


Рис. 1. Схематичное представление ZIP-архива, содержащего два файла: File#1 и File#2

Автор: Vasiliy Sokolov

 

Кто нибудь тестировал код ? В мт 4 Работает ?

 
Впечатляющее сжатие исторических данных вместе с рассмотренной идеей применения его к содержимому оперативной памяти позволяют предположить, что есть надежда на радикальное сокращение требуемых терминалу MT5 ресурсов памяти. Случится это?
 
Vladimir Pastushak:

Кто нибудь тестировал код ? В мт 4 Работает ?

Не только работает но и используется на полную катушку в таких проектах как MetaCOT 2.
 
Vladimir:
Впечатляющее сжатие исторических данных вместе с рассмотренной идеей применения его к содержимому оперативной памяти позволяют предположить, что есть надежда на радикальное сокращение требуемых терминалу MT5 ресурсов памяти. Случится это?
Сам МТ5 требует совсем немного ресурсов. Но при запросе котировок память используется в зависимости от переменной "макс. баров в истории". Не знаю пофиксили ли эту провальную недоработку но вроде как обещали ее убрать.
 

Что то поломалось, вот такое при компиляции.

Ругается в ZipHeader.mqh 

 

Пресловутый кастинг структур ругается. Держите исправленную версию в аттаче.

Файлы:
Zip.zip  11 kb
 
Vasiliy Sokolov:

Пресловутый кастинг структур ругается. Держите исправленную версию в аттаче.

А под МТ4 должно работать? У меня такая ситуация.
'm_array' - structures containing objects are not allowed       Dictionary.mqh  252     25
cannot cast 'DoubleValue' to 'ULongValue'       Dictionary.mqh  209     14
 
Stanislav Korotky:
А под МТ4 должно работать? У меня такая ситуация.

#property striсt помогает?

 

В новой версии по мимо union еще добавлен дополнительный механизм извлечения структур данных из архива, если поля структур не заполнены. (Было замечено, что продукты Microsoft плюют на стандарт с высокой башни и просто не заполняют поля вроде "размер файла"). Новая версия теперь работает с такими проблемными архивами.

Я уже добавил новую версию в архив к статье. Кажется ее уже обновили, поэтому можете скачивать аттач к статье.

 
Stanislav Korotky:
А под МТ4 должно работать? У меня такая ситуация.

Сейчас Вашу ошибку внимательно посмотрел -  та же ситуация с кастингом структур, но уже в другом контейнере - CDictionary. Замените Include\Dictionary.mqh на вариант приложенный внизу.

И да, под МТ4 все прекрасно работает и скажу больше CZip рабочая лошадка в моих проектах на МТ4.

Файлы:
Dictionary.mqh  38 kb
Причина обращения: