powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как подружить zlib от Deplhi с Lazarus
39 сообщений из 39, показаны все 2 страниц
Как подружить zlib от Deplhi с Lazarus
    #40114057
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго всем дня! На данный момент у меня существует программка, которая формирует строку, затем сжимает ее с помощью библиотеки zlib функцией ZCompressStr и запихивает получившееся в двухмерный штрих-код.
Другая программка соответственно при считывании кода, распаковывает сжатую строку и производит с ней дальнейшие действия.
Теперь, ту первую программку я пытаюсь перевести в кросс-платформу для работы ее на линуксе, zlib от делфей воткнуть в лазарь у меня не получилось. В стандартной библиотеке zlib в лазаре нет функции ZCompressStr. Вот и получается, что я пока не знаю как мне подружить сжатие строки и дальнейшую распаковку ее zlib-ом делфей. Что можете подсказать по данному вопросу?
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114060
LuciferNovoros
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114063
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LuciferNovoros, пробежался по коду модуля. Вроде что-то похожее на правду. Мне главное, чтобы в линуксе она взлетела и потом распаковалась злибом в делфи программе. Будем пробовать. Спасибо. Отпишусь о результатах как попробую
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114090
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dartveider13
Что можете подсказать по данному вопросу?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
program Project1;

uses

 SysUtils, Classes, ZStream;

function ZCompressStr(const AString : UnicodeString; ALevel : TCompressionlevel = clDefault) : TBytes;
var
 Stream     : TBytesStream;
 Compressor : TCompressionstream;
begin
  Stream := TBytesStream.Create;
  try
   Compressor := TCompressionStream.Create(ALevel, Stream);
   try
    Compressor.WriteBuffer(Pointer(AString)^, Length(AString) * SizeOf(WideChar));
   finally
     Compressor.Free;
   end;
   Result := Copy(Stream.Bytes, 0, Stream.Size);
  finally
    Stream.Free;
  end;
end;

function ZDecompressStr(const ABytes: TBytes) : UnicodeString;
const
  Growth = 256;
var
 Stream       : TBytesStream;
 Decompressor : TDecompressionstream;
 Count        : LongInt;
begin
  Result := '';
  Stream := TBytesStream.Create(ABytes);
  try
   Decompressor := TDecompressionStream.Create(Stream);
   try
    repeat
      Setlength(Result, Length(Result) + Growth);
      Count := Decompressor.Read(PByte(Result)[(Length(Result) - Growth) * SizeOf(WideChar)], Growth * SizeOf(WideChar));
    until Count <> Growth * SizeOf(WideChar);
    Assert(Not Odd(Count));
    SetLength(Result, Length(Result) - (Growth * SizeOf(WideChar) - Count) Div 2);
   finally
     Decompressor.Free;
   end;
  finally
    Stream.Free;
  end;
end;

begin
 WriteLn('"', ZDecompressStr(ZCompressStr('Hello, ZLib!')), '"');
end. 
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114118
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dartveider13,
paszlib
unzip
FreePascalArchivePackage
abbrevia

С аббревией работал. Жмет нормально
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114157
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ух ты сколько вариантов. Спасибо
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114162
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
until Count <> Growth * SizeOf(WideChar);[/src]
Поэтому я в сжатый стрим добавляю последние 4 байта размера несжатого потока
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114194
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Kazantsev Alexey
until Count <> Growth * SizeOf(WideChar);[/src]
Поэтому я в сжатый стрим добавляю последние 4 байта размера несжатого потока

Почему не первые 4 байта?

TLV - тип, длина, значение. Вроде классика такого подобия передачи данных.
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114203
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А полученные сжатием TBytes после сжатия как затолкать в объект ШК библиотеки LazBarCodes? В делфях я использовал длл-ку генерации символики ацтек
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114205
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
Kazantsev Alexey
until Count <> Growth * SizeOf(WideChar);[/src]
Поэтому я в сжатый стрим добавляю последние 4 байта размера несжатого потока

А как вообще выполняется распаковка, когда размер неизвестен?
...мне давеча потребовалось (с помощью C++) распаковать поток, сжатый дельфийским классом TCompressionStream.
Но вот там (в С++) дельфийского класса TDeCompressionStream нет, и, как всегда - трясти нужно, а не думать... тупо выделял память сперва 2*размер сжатого, потом в цикле пытался распаковать в указанный буфер, если получал "мало памяти" - то увеличивал буфер, и в начало цикла. Оно как бы работает, но, мягко говоря, грязновато.
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114220
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
Почему не первые 4 байта?
Потому что наследие
wadman
TLV - тип, длина, значение. Вроде классика такого подобия передачи данных.
Тоже не совсем так. Потому что в этой классике длина - это длина текущих данных, а не данных, которые получаются после преобразования
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114222
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Потому что в этой классике длина - это длина текущих данных, а не данных, которые получаются после преобразования

Важно знать, что контролировать при получении, а не после. После преобразования уже иные процессы идут.
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114223
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
А как вообще выполняется распаковка, когда размер неизвестен?
Чанками. + LinkedList по желанию
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114236
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
А как вообще выполняется распаковка, когда размер неизвестен?

Последовательно, пока inflate не вернёт тебе Z_STREAM_END.
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114258
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dartveider13
А полученные сжатием TBytes после сжатия как затолкать в объект ШК библиотеки LazBarCodes?

Примерно так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
var s : UTF8String;
ZBytes : TBytes;
begin
 ZBytes := ZCompressStr('some text');
 SetLength(s, Length(ZBytes));
 Move(Pointer(ZBytes)^, Pointer(s)^, Length(s));
 ШК.Text := s;
end;
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114416
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey, попробовал на тестовом проекте. Вылетает пустая ошибка. ШК исчезает с радаров
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114419
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гемор какой-то с этими lazbarcodes, сложно готовятся))) На делфе я использовал библиотеку aztecgen. Он в объект TImage рисовал код. Может есть что-то подобное?
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114422
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или может быть вариант задействовать библиотеку lazbarcodes, но генерировать код не на компоненте а в картинке?
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114443
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что мешает портировать ацтекген под лазаря?
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114450
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutal, исходник этой либы написан как я понимаю на плюсах, я в них не очень. Тут как я понимаю надо попробовать собрать его в линуксе? Что получится фиг знает. С инета я взял его и скомпиленой длл-кой
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114463
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dartveider13
попробовал на тестовом проекте. Вылетает пустая ошибка. ШК исчезает с радаров

Размер данных какой?
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114464
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey, Попробовал на простом Hello world. Просто сделал тестовый проект. Сжатие и распаковка работают для строк на ура. С учетом того, что я перевожу их еще до сжатия в base64 тоже нормально работает. А вот когда пытаюсь в объект azteccode затолкать, то вываливает ошибку. Причем по дебагеру он проходит эту строку присваивания переменной строки без ошибок
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114465
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
dartveider13
А полученные сжатием TBytes после сжатия как затолкать в объект ШК библиотеки LazBarCodes?

Примерно так:
Код: pascal
1.
2.
 ШК.Text := s;
end;



после этой строки ошибка в модуле ubarcodes на строке 381
Версия lazbarcodes 1.0.4 если это о чем то говорит
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114473
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dartveider13,

Похоже, проблема появляется, когда в данных присутствует нулевой байт. Даже просто ШК.Text := #0; приводит к ошибке. Можно, либо попытаться исправить ошибку в LazBarCode, либо изменить формат кодирования данных.
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114480
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
dartveider13,
Похоже, проблема появляется, когда в данных присутствует нулевой байт. Даже просто ШК.Text := #0; приводит к ошибке.

Я всегда поражался таким способностям так быстро понимать откуда проблема))))

Kazantsev Alexey
dartveider13,
Можно, либо попытаться исправить ошибку в LazBarCode

Думаю с моими способностями, я вряд ли это осилю

Kazantsev Alexey
dartveider13,
либо изменить формат кодирования данных.

А здесь подразумевается замена UTF8String на что-то другое?
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114481
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dartveider13
А здесь подразумевается замена UTF8String на что-то другое?

Нет, сжатые данные нужно представить в форме исключающей появление нулевых байтов. Например, base64 ;)
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114485
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey, т е после сжатия еще раз закодировать строку в base64?
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114487
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey, а вариант с подправить исходник очень сложнее?
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114495
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dartveider13
т е после сжатия еще раз закодировать строку в base64?

Да. И если будет выбран этот вариант, то стоит сделать полную ревизию формата. Например, отказаться от кодирования строки в base64 перед сжатием. Отказаться от сжатия UnicodeString и сжимать байты.

dartveider13
а вариант с подправить исходник очень сложнее?

Это определённо сложнее изменения формата данных.
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114500
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey, мда... Тут придется переделывать вторую часть, которая на винде на делфях... Но байты я вроде уже сжимал пробовал. Там создается два потока: поток с base64 и поток сжатия. И все это добро потом в ШК запихивается.
Да уж с либой aztecgen было проще. Жаль что я ее под линукс не соберу, а длл-ки под линуксом не работают
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114508
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dartveider13
Fr0sT-Brutal, исходник этой либы написан как я понимаю на плюсах, я в них не очень. Тут как я понимаю надо попробовать собрать его в линуксе? Что получится фиг знает. С инета я взял его и скомпиленой длл-кой

Тогда да. Хотя всегда остается Wine
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114519
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutal, любопытно, любопытно. Это ж что получается. Я могу попробовать через wine запустить уже работающую программу windows?
Как же мало я еще знаю о линуксах)))
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114586
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dartveider13,

Немного покопался в LazBarCodes и оказалось, что ноль во входных данных считается ошибкой.
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114596
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Покопался ещё немного, и оказалось, что автор zint (порт которой используется в LazBarCodes) признал, что это не правильно и исправил ошибку . Я пофиксил lbc_aztec.pas, можно пользоваться.
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114669
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dartveider13
Fr0sT-Brutal, любопытно, любопытно. Это ж что получается. Я могу попробовать через wine запустить уже работающую программу windows?
Как же мало я еще знаю о линуксах)))

Да, я запускал свои: гуй+файлы+сетевые операции+БД FB - заводилось
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114728
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey, Ваууу спасибо. Я обязательно попробую. Вам прям тыща спасибо так отвлечься на чужой вопрос
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114729
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutal, этот вариант я тоже обязательно попробую. Интересно посмотреть. Так то моя програ на винде, которая сейчас у пользователей стоит не сложнее блокнота
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114738
dartveider13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну что ж. Под wine моя программа взлетела на ура. Будем использовать этот вариант пока что, но все таки я думаю допилю версию на лазаре. Отдельное спасибо Алексею за посильную помощь с разборками lazbarcodes
...
Рейтинг: 0 / 0
Как подружить zlib от Deplhi с Lazarus
    #40114751
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dartveider13,

zlib под linux в виде so-ки спокойной ставится\качается
ZLib.pp в стандартной поставке fpc

описалка

вот пример постепенной распаковки

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
      a:=eRead(inBuf,Length(inBuf));
      if a<=0 then begin
        Result:=a;
        exit;
      end;
      InBufSize:=a;
      Result:=DecodeTo(buf,ASize);

function TMCPFingro.DecodeTo(var Buf; ASize: integer): integer;
var
  status:integer;
begin
    //* We are now decompressing from inbuf to outbuf */

    FZRec.next_in := @InBuf;

    FZRec.next_out := @Buf;
    FZRec.avail_in := InBufSize;
    FZRec.avail_out:= ASize;

    status := inflate(FZRec, Z_PARTIAL_FLUSH);

    if (status = Z_OK) or (status = Z_STREAM_END) then begin
        //* Successful decompression */
        InBufSize:=FZRec.avail_in;
        if InBufSize>0 then begin
          move(FZRec.next_in^,InBuf,InBufSize);
        end;
        Result := PtrInt(FZRec.next_out) - PtrInt(@Buf);

        if (status = Z_STREAM_END) then begin
            //* Turn off compression too */
            DoneDecoder;
            DecodeMode:=false;
        end;
    end else

    if (status = Z_BUF_ERROR) then begin
        //* Full buffers? Maybe we need more output space.. */
        Result:=0;
    end else begin
        Result:=0;
    end;
end;

procedure TMCPFingro.DoneDecoder;
begin
  if CanTranslate then begin
    inflateEnd(FZRec);
    CanTranslate:=false;
  end;
end;

procedure TMCPFingro.InitDecoder;
begin
  if CanTranslate then exit;
  {$IFNDEF FPC}
  FZRec.zalloc := zcalloc;
  FZRec.zfree := zcfree;
  {$ENDIF}
  CanTranslate:=inflateInit_(FZRec, zlib_version, sizeof(FZRec))>=0;
  
end;

...
Рейтинг: 0 / 0
39 сообщений из 39, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как подружить zlib от Deplhi с Lazarus
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]