OberonCore
https://forum.oberoncore.ru/

Zlib
https://forum.oberoncore.ru/viewtopic.php?f=90&t=963
Страница 5 из 5

Автор:  Евгений Темиргалеев [ Четверг, 24 Май, 2012 11:04 ]
Заголовок сообщения:  Re: Zlib

Архивы на сайте обновлены:
Цитата:
r322 | SidorovVN | ...
Измененные пути:
M /Zlib/Zlib/Mod/Files.odc
M /Zlib/Zlib/Mod/Zip.odc

Исправлена ошибка с датами в архиве

Автор:  Oleg N. Cher [ Пятница, 25 Май, 2012 20:24 ]
Заголовок сообщения:  Re: Zlib

Евгений Темиргалеев писал(а):
Раз уж Вы, Олег, на это дело подвязались, то может и займетесь внесением поправок?
Я бы с радостью, Евгений, но тут и хочется чтобы лежало для всех и без багов, и колется — явно моей квалификации на такие правки не хватает. Да и боязно туда лезть, где даже не разобрался толком. Честно признаюсь, без понтов. Хотя жизнь, бывает, и заставляет. Впрочем, как видите, в этом деле некоторая польза есть и от меня.

P.S. Всем спасибо, сегодня-завтра разместим исправленную версию на сайте Гельмута.

Автор:  Oleg N. Cher [ Среда, 06 Февраль, 2013 01:11 ]
Заголовок сообщения:  Re: Zlib

Господа, как быть, если нужно упаковывать/распаковывать с помощью Zlib файлы большого (1 Gb и выше) размера? Ведь, насколько я понимаю, в моменты работы процедур (раз)архивации будет происходить значительная задержка всех задач, работающих внутри BlackBox, запущенных по таймеру (сетевых и прочих). Решаема ли каким-либо образом эта проблема? Как сделать это максимально элегантно в духе кооперативной многозадачности BlackBox?

Автор:  Илья Ермаков [ Среда, 06 Февраль, 2013 14:29 ]
Заголовок сообщения:  Re: Zlib

Надо перепрограммировать алгоритм сжатия на базе Action, чтобы работал "квантами".

Автор:  Пётр Кушнир [ Среда, 06 Февраль, 2013 14:49 ]
Заголовок сообщения:  Re: Zlib

Я применял такой способ:

блокирующий цикл:
Код:
WHILE ~rd.eot DO
    rd.Read();
END;


превращается в

Код:
TYPE
    ReadAction = POINTER TO RECORD (Services.Action)
        rd: Reader;
    END;


PROCEDURE (a: ReadAction) Do;
   CONST maxSpeed = 10;
   VAR speedUp: INTEGER;
BEGIN
    speedUp:=0;
    WHILE ~a.rd.eot & (speedUp<maxSpeed) DO
        a.rd.Read;
        INC(speedUp)
    END;
    IF ~a.rd.eot THEN Services.DoLated(a, Services.immediately) END;
END Do;


Либо, если пользователям достаточно лишь неблокированного гуя, можно вставлять в цикл процедуру:
Код:
PROCEDURE Process;
   VAR msg: WinApi.MSG; res: INTEGER;
BEGIN
   res := WinApi.TranslateMessage(msg);
   res := WinApi.DispatchMessageW(msg)
END Process;


Либо можно в цикле внутри Action следить не за количеством квантов speedUp, а за временем, которое было потрачено, тогда реализация изменится на:
Код:
PROCEDURE (a: ReadAction) Do;
   CONST dt = 50; (* msecs *)
   VAR t0: LONGINT;
BEGIN
    t0:=Services.Ticks();
    WHILE ~a.rd.eot & ((Services.Ticks()-t0)<dt) DO
        a.rd.Read;
    END;
    IF ~a.rd.eot THEN Services.DoLated(a, Services.immediately) END;
END Do;


Ну а для тех, кто совсем не боится нового, могу предложить готовую реализацию всего вышеописанного в виде детали в модуле ypkTaskService, хотя бы в качестве примера.

И это всё без упоминания сторонних dll-библиотек, виндовых тредов, и прочего.

Автор:  Штирлиц [ Четверг, 07 Февраль, 2013 07:29 ]
Заголовок сообщения:  Re: Zlib

Или запускать еще один Blackbox под задачи архивации/разархивации
У Ильи Ермакова,по-моему, есть соответствующий опыт организации взаимодействия

Автор:  Иван Денисов [ Четверг, 01 Июнь, 2017 07:57 ]
Заголовок сообщения:  Re: Zlib

Опубликовал это расширение в новом хранилище:
https://blackbox.obertone.ru/component/Zlib

Автор:  Иван Денисов [ Вторник, 06 Июнь, 2017 21:24 ]
Заголовок сообщения:  Re: Zlib

Исследовал вопрос и выяснил, что если EFS бит заменить на 11 (сейчас стоит 10), то архивы нормально начинает распаковывать WinRar и 7-Zip.

Автор:  Иван Денисов [ Вторник, 06 Июнь, 2017 22:31 ]
Заголовок сообщения:  Re: Zlib

Обновил с исправлением бита:
https://blackbox.obertone.ru/view/4a6c5 ... b28161ca09

Постарался максимально убрать WinApi из основных модулей.

Автор:  Info21 [ Среда, 07 Июнь, 2017 02:45 ]
Заголовок сообщения:  Re: Zlib

Ценно, особенно насчёт WinApi ))

Автор:  Иван Денисов [ Четверг, 08 Июнь, 2017 13:53 ]
Заголовок сообщения:  Re: Zlib

Загрузил новую версию: https://blackbox.obertone.ru/component/Zlib

Подправил несколько недочетов еще. Один мой косяк был с тем, что не создавал строки перед записью в них.

Еще в старом варианте был нестабильный момент, связанный с тем, что миллисекунды не устанавливались в ноль в процедуре GetFileModifyDateTime. На винде это не приводило к ошибкам, а вот в Wine там оказывался мусор из оперативной памяти и миллисекунды не нулевые. Поэтому процедура выдавала нулевое время, которое устанавливалось для файлов в архиве.

Проверил эту версию на совместимость с Freenix сборкой. Все кроме установки дат измерения в файлах и модуля Хельмута Цинна ZlibCmds работает корректно.
В Linux Ubuntu кириллические названия файлов распаковываются корректно!

Автор:  Роман М. [ Суббота, 30 Сентябрь, 2017 21:27 ]
Заголовок сообщения:  Re: Zlib

Иван Денисов писал(а):
Загрузил новую версию: https://blackbox.obertone.ru/component/Zlib

В моей версии 1.6 это не работает:
Код:
   IF Dialog.IsWindows() THEN
      ASSERT(Kernel.ThisMod("ZlibFilesWin") # NIL, 21);
      Log.String("Hook for Windows."); Log.Ln;
   ELSIF Dialog.IsLinux() THEN
      ASSERT(Kernel.ThisMod("ZlibFilesLin") # NIL, 21);
      Log.String("Hook for Linux."); Log.Ln;
   END

Если на то пошло, ОС-зависимые фишки лучше было вынести в отдельный модуль и компилировать в завивимости от выбора соответствующего командера.
Также из-за зависимости Kernel.Utf8ToString не компилируется код ZlibZip.

Далее, судя по коду, отсутствует обработка опциональной секции Data Descriptor файла ZIP (при включенном бите 3 флага genPurpBitFlag). Это означает, что файлы JAR, APK могут быть обработаны некорректно.

И ещё странно почему на КП написано так:
Код:
ent.dataDescriptor := ODD(sintDummy DIV 8);

а не так:
Код:
ent.dataDescriptor := 3 IN ent.genPurpBitFlag;


Вложения:
test_data_descriptor.zip [405 байт]
Скачиваний: 72

Автор:  Евгений Темиргалеев [ Четверг, 07 Июнь, 2018 10:42 ]
Заголовок сообщения:  Re: Zlib

Иван Денисов писал(а):
Исследовал вопрос и выяснил, что если EFS бит заменить на 11 (сейчас стоит 10), то архивы нормально начинает распаковывать WinRar и 7-Zip.
Похоже, это была просто описка -- значение 11 в описании формата.

Можно еще добавить хак для линуховых архиваторов, которые кодировку определяют не по флагу EFS, а по версии архиватора в центральном каталоге архива.
Код:
   (* Writes file header in central directory, updates ent.offsetCentralDir *)
   PROCEDURE WriteFileHeader(ent: Entry; wr: Files.Writer);
     VAR
       i, commentLen, nameLen: INTEGER;
       oem: POINTER TO ARRAY OF SHORTCHAR;
         vMadeBy: INTEGER;
   BEGIN
      ent.offsetCentralDir := wr.Pos();
      WriteInt(wr, CentralFileHeaderSignature);   (* central file header signature *)
      IF EFS IN ent.genPurpBitFlag THEN
         vMadeBy := (*UNIX*)3 * 100H + CompatibleVersions * 10;
      ELSE
         vMadeBy := (*MS-DOS*)0 * 100H + CompatibleVersions * 10
      END;
      ...

Автор:  Евгений Темиргалеев [ Четверг, 07 Июнь, 2018 11:11 ]
Заголовок сообщения:  Re: Zlib

К сведению. Реализация (в оригинале A2 -- тоже) имеет ограничение -- метод "без сжатия" поддерживает только блоки чуть меньше 64К.
Код:
   CONST N = 64*1024; (* трап 113 в ZlibDeflate.CompressStored *)
   VAR in: ARRAY N OF SHORTCHAR;
   VAR out: ARRAY N+128 OF SHORTCHAR;
   VAR outLen: LONGINT; VAR res: INTEGER;
   ZlibDeflate.Compress(in, out, 0, N, 0, N+128, 0, 0, outLen, res);
   Log.String("res = "); Log.Int(res); Log.Tab; Log.String("outLen = "); Log.Real(outLen); Log.Ln;

Страница 5 из 5 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/