OberonCore https://forum.oberoncore.ru/ |
|
Zlib https://forum.oberoncore.ru/viewtopic.php?f=90&t=963 |
Страница 5 из 6 |
Автор: | Евгений Темиргалеев [ Четверг, 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;
|
Автор: | Евгений Темиргалеев [ Четверг, 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; |
Автор: | Иван Денисов [ Вторник, 20 Октябрь, 2020 07:12 ] |
Заголовок сообщения: | Re: Zlib |
Для совместимости с подсистемой Odf пришлось убрать одну проверку постусловий. В версии, которая опубликована у Цинна нет вообще никаких проверок в этой процедуре GetFileModifyDateTime... Также адаптировал расширение под версию 1.8. https://blackbox.oberon.org/extension/Zlib Если кто-то сделает реализацию для ZlibFilesLin, то вероятно в Linux версии файлы будут добавляться в архивы с корректными датами. |
Автор: | Иван Денисов [ Вторник, 20 Октябрь, 2020 11:00 ] |
Заголовок сообщения: | Re: Zlib |
Попробовал по статье http://www.vsokovikov.narod.ru/New_MSDN ... tetime.htm сделать вот такую реализацию Код: date := SHORT(day + month * 16 + (year-1980) * 256); time := SHORT(second DIV 2 + minute * 16 + hour * 1024); Но так вместо 20 октября 2020 выдаёт 5 мая 2000 года... Есть идеи, что я не правильно понимаю? |
Автор: | albobin [ Вторник, 20 Октябрь, 2020 12:30 ] |
Заголовок сообщения: | Re: Zlib |
коэффициенты неверные Код: date := SHORT(day + month * 32 + (year-1980) * 512);
time := SHORT(second DIV 2 + minute * 32 + hour * 2048); |
Автор: | Иван Денисов [ Вторник, 20 Октябрь, 2020 18:37 ] |
Заголовок сообщения: | Re: Zlib |
albobin писал(а): коэффициенты неверные Код: date := SHORT(day + month * 32 + (year-1980) * 512); time := SHORT(second DIV 2 + minute * 32 + hour * 2048); Спасибо. Так верно считает. Осталось только еще применить сдвиг относительно локального времени. |
Автор: | Иван Денисов [ Вторник, 20 Октябрь, 2020 20:40 ] |
Заголовок сообщения: | Re: Zlib |
Обнаружил, что есть нестыковочка в реализации HostFiles.GetModDate В Windows возвращается системное время. А в Linux идет наоборот пересчёт в локальное. Наверное будет правильно подстроить всё п од Windows, чтобы было больше сходства? Вложение:
|
Автор: | Иван Денисов [ Среда, 21 Октябрь, 2020 04:02 ] |
Заголовок сообщения: | Re: Zlib |
Вот такая получилась кросс-платформенная реализация, чтобы взять метки времени и даты для файла в dos формате, чтобы затем записать в архив. Код: VAR
days: ARRAY 13 OF INTEGER; PROCEDURE (hk: Hook) GetFileModifyDateTime (f: Files.File; VAR date, time: SHORTINT); VAR year, month, day, hour, minute, second, bais: INTEGER; PROCEDURE Prev(): INTEGER; BEGIN IF month = 1 THEN RETURN 12 ELSE RETURN month - 1 END END Prev; PROCEDURE Next(): INTEGER; BEGIN IF month = 12 THEN RETURN 1 ELSE RETURN month + 1 END END Next; BEGIN HostFiles.GetModDate(f, year, month, day, hour, minute, second); Dates.GetUTCBias(bais); minute := minute - bais; IF minute > 59 THEN hour := hour + minute DIV 60; minute := minute MOD 60; ELSIF minute < 0 THEN hour := hour + minute DIV 60; minute := minute MOD 60; END; IF hour > 23 THEN INC(day); hour := hour MOD 24; ELSIF hour < 0 THEN DEC(day); hour := hour MOD 24; END; IF year MOD 4 = 0 THEN days[2] := 29 ELSE days[2] := 28 END; IF day < 1 THEN month := Prev(); IF month = 12 THEN DEC(year) END; day := days[month] ELSIF day > days[month] THEN month := Next(); IF month = 1 THEN INC(year) END; day := 1 END; date := SHORT(day + month * 32 + (year-1980) * 512); time := SHORT(second DIV 2 + minute * 32 + hour * 2048); END GetFileModifyDateTime; BEGIN days[1] := 31; days[2] := 28; days[3] := 31; days[4] := 30; days[5] := 31; days[6] := 30; days[7] := 31; days[8] := 31; days[9] := 30; days[10] := 31; days[11] := 30; days[12] := 31; |
Страница 5 из 6 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |