Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Как подружить zlib от Deplhi с Lazarus  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 769
Доброго всем дня! На данный момент у меня существует программка, которая формирует строку, затем сжимает ее с помощью библиотеки zlib функцией ZCompressStr и запихивает получившееся в двухмерный штрих-код.
Другая программка соответственно при считывании кода, распаковывает сжатую строку и производит с ней дальнейшие действия.
Теперь, ту первую программку я пытаюсь перевести в кросс-платформу для работы ее на линуксе, zlib от делфей воткнуть в лазарь у меня не получилось. В стандартной библиотеке zlib в лазаре нет функции ZCompressStr. Вот и получается, что я пока не знаю как мне подружить сжатие строки и дальнейшую распаковку ее zlib-ом делфей. Что можете подсказать по данному вопросу?
23 ноя 21, 08:39    [22399509]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
LuciferNovoros
Member

Откуда: Новороссийск
Сообщений: 99
Я это использую. https://github.com/Nik-vr/lazarus-zlib/blob/master/ZLibEx.pas
23 ноя 21, 08:57    [22399512]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 769
LuciferNovoros, пробежался по коду модуля. Вроде что-то похожее на правду. Мне главное, чтобы в линуксе она взлетела и потом распаковалась злибом в делфи программе. Будем пробовать. Спасибо. Отпишусь о результатах как попробую
23 ноя 21, 09:06    [22399515]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5309
dartveider13
Что можете подсказать по данному вопросу?

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. 
23 ноя 21, 10:42    [22399548]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
Док
Member

Откуда: Казань
Сообщений: 7224
dartveider13,
paszlib
unzip
FreePascalArchivePackage
abbrevia

С аббревией работал. Жмет нормально
23 ноя 21, 12:34    [22399606]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 769
Ух ты сколько вариантов. Спасибо
23 ноя 21, 13:39    [22399664]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13386
Kazantsev Alexey
until Count <> Growth * SizeOf(WideChar);[/src]
Поэтому я в сжатый стрим добавляю последние 4 байта размера несжатого потока
23 ноя 21, 13:54    [22399674]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 27318
_Vasilisk_
Kazantsev Alexey
until Count <> Growth * SizeOf(WideChar);[/src]
Поэтому я в сжатый стрим добавляю последние 4 байта размера несжатого потока

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

TLV - тип, длина, значение. Вроде классика такого подобия передачи данных.
23 ноя 21, 15:23    [22399720]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 769
А полученные сжатием TBytes после сжатия как затолкать в объект ШК библиотеки LazBarCodes? В делфях я использовал длл-ку генерации символики ацтек

Сообщение было отредактировано: 23 ноя 21, 15:42
23 ноя 21, 15:42    [22399738]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2731
_Vasilisk_
Kazantsev Alexey
until Count <> Growth * SizeOf(WideChar);[/src]
Поэтому я в сжатый стрим добавляю последние 4 байта размера несжатого потока

А как вообще выполняется распаковка, когда размер неизвестен?
...мне давеча потребовалось (с помощью C++) распаковать поток, сжатый дельфийским классом TCompressionStream.
Но вот там (в С++) дельфийского класса TDeCompressionStream нет, и, как всегда - трясти нужно, а не думать... тупо выделял память сперва 2*размер сжатого, потом в цикле пытался распаковать в указанный буфер, если получал "мало памяти" - то увеличивал буфер, и в начало цикла. Оно как бы работает, но, мягко говоря, грязновато.
23 ноя 21, 15:51    [22399741]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13386
wadman
Почему не первые 4 байта?
Потому что наследие
wadman
TLV - тип, длина, значение. Вроде классика такого подобия передачи данных.
Тоже не совсем так. Потому что в этой классике длина - это длина текущих данных, а не данных, которые получаются после преобразования
23 ноя 21, 16:40    [22399770]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 27318
_Vasilisk_
Потому что в этой классике длина - это длина текущих данных, а не данных, которые получаются после преобразования

Важно знать, что контролировать при получении, а не после. После преобразования уже иные процессы идут.
23 ноя 21, 16:43    [22399772]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13386
ъъъъъ
А как вообще выполняется распаковка, когда размер неизвестен?
Чанками. + LinkedList по желанию
23 ноя 21, 16:47    [22399776]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5309
ъъъъъ
А как вообще выполняется распаковка, когда размер неизвестен?

Последовательно, пока inflate не вернёт тебе Z_STREAM_END.
23 ноя 21, 17:09    [22399791]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5309
dartveider13
А полученные сжатием TBytes после сжатия как затолкать в объект ШК библиотеки LazBarCodes?

Примерно так:
var s : UTF8String;
ZBytes : TBytes;
begin
 ZBytes := ZCompressStr('some text');
 SetLength(s, Length(ZBytes));
 Move(Pointer(ZBytes)^, Pointer(s)^, Length(s));
 ШК.Text := s;
end;
23 ноя 21, 17:30    [22399815]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 769
Kazantsev Alexey, попробовал на тестовом проекте. Вылетает пустая ошибка. ШК исчезает с радаров
24 ноя 21, 07:37    [22400023]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 769
гемор какой-то с этими lazbarcodes, сложно готовятся))) На делфе я использовал библиотеку aztecgen. Он в объект TImage рисовал код. Может есть что-то подобное?
24 ноя 21, 07:49    [22400028]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 769
Или может быть вариант задействовать библиотеку lazbarcodes, но генерировать код не на компоненте а в картинке?
24 ноя 21, 08:12    [22400031]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 990
Что мешает портировать ацтекген под лазаря?
24 ноя 21, 10:28    [22400073]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 769
Fr0sT-Brutal, исходник этой либы написан как я понимаю на плюсах, я в них не очень. Тут как я понимаю надо попробовать собрать его в линуксе? Что получится фиг знает. С инета я взял его и скомпиленой длл-кой
24 ноя 21, 10:54    [22400082]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5309
dartveider13
попробовал на тестовом проекте. Вылетает пустая ошибка. ШК исчезает с радаров

Размер данных какой?
24 ноя 21, 11:22    [22400099]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 769
Kazantsev Alexey, Попробовал на простом Hello world. Просто сделал тестовый проект. Сжатие и распаковка работают для строк на ура. С учетом того, что я перевожу их еще до сжатия в base64 тоже нормально работает. А вот когда пытаюсь в объект azteccode затолкать, то вываливает ошибку. Причем по дебагеру он проходит эту строку присваивания переменной строки без ошибок
24 ноя 21, 11:29    [22400104]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 769
Kazantsev Alexey
dartveider13
А полученные сжатием TBytes после сжатия как затолкать в объект ШК библиотеки LazBarCodes?

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


после этой строки ошибка в модуле ubarcodes на строке 381
Версия lazbarcodes 1.0.4 если это о чем то говорит

Сообщение было отредактировано: 24 ноя 21, 11:38
24 ноя 21, 11:32    [22400106]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5309
dartveider13,

Похоже, проблема появляется, когда в данных присутствует нулевой байт. Даже просто ШК.Text := #0; приводит к ошибке. Можно, либо попытаться исправить ошибку в LazBarCode, либо изменить формат кодирования данных.
24 ноя 21, 11:54    [22400116]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 769
Kazantsev Alexey
dartveider13,
Похоже, проблема появляется, когда в данных присутствует нулевой байт. Даже просто ШК.Text := #0; приводит к ошибке.

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

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

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

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

А здесь подразумевается замена UTF8String на что-то другое?
24 ноя 21, 12:18    [22400128]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5309
dartveider13
А здесь подразумевается замена UTF8String на что-то другое?

Нет, сжатые данные нужно представить в форме исключающей появление нулевых байтов. Например, base64 ;)
24 ноя 21, 12:25    [22400134]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 769
Kazantsev Alexey, т е после сжатия еще раз закодировать строку в base64?
24 ноя 21, 12:44    [22400143]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 769
Kazantsev Alexey, а вариант с подправить исходник очень сложнее?
24 ноя 21, 12:47    [22400145]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5309
dartveider13
т е после сжатия еще раз закодировать строку в base64?

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

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

Это определённо сложнее изменения формата данных.
24 ноя 21, 13:10    [22400156]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 769
Kazantsev Alexey, мда... Тут придется переделывать вторую часть, которая на винде на делфях... Но байты я вроде уже сжимал пробовал. Там создается два потока: поток с base64 и поток сжатия. И все это добро потом в ШК запихивается.
Да уж с либой aztecgen было проще. Жаль что я ее под линукс не соберу, а длл-ки под линуксом не работают
24 ноя 21, 13:22    [22400161]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 990
dartveider13
Fr0sT-Brutal, исходник этой либы написан как я понимаю на плюсах, я в них не очень. Тут как я понимаю надо попробовать собрать его в линуксе? Что получится фиг знает. С инета я взял его и скомпиленой длл-кой

Тогда да. Хотя всегда остается Wine
24 ноя 21, 13:45    [22400176]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 769
Fr0sT-Brutal, любопытно, любопытно. Это ж что получается. Я могу попробовать через wine запустить уже работающую программу windows?
Как же мало я еще знаю о линуксах)))

Сообщение было отредактировано: 24 ноя 21, 14:11
24 ноя 21, 14:08    [22400193]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5309
dartveider13,

Немного покопался в LazBarCodes и оказалось, что ноль во входных данных считается ошибкой.
24 ноя 21, 16:28    [22400277]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5309
Покопался ещё немного, и оказалось, что автор zint (порт которой используется в LazBarCodes) признал, что это не правильно и исправил ошибку. Я пофиксил lbc_aztec.pas, можно пользоваться.

К сообщению приложен файл (lbc_aztec.zip - 59Kb) cкачать
24 ноя 21, 16:44    [22400287]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 990
dartveider13
Fr0sT-Brutal, любопытно, любопытно. Это ж что получается. Я могу попробовать через wine запустить уже работающую программу windows?
Как же мало я еще знаю о линуксах)))

Да, я запускал свои: гуй+файлы+сетевые операции+БД FB - заводилось
24 ноя 21, 19:11    [22400378]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 769
Kazantsev Alexey, Ваууу спасибо. Я обязательно попробую. Вам прям тыща спасибо так отвлечься на чужой вопрос
25 ноя 21, 05:52    [22400463]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 769
Fr0sT-Brutal, этот вариант я тоже обязательно попробую. Интересно посмотреть. Так то моя програ на винде, которая сейчас у пользователей стоит не сложнее блокнота
25 ноя 21, 05:54    [22400464]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 769
Ну что ж. Под wine моя программа взлетела на ура. Будем использовать этот вариант пока что, но все таки я думаю допилю версию на лазаре. Отдельное спасибо Алексею за посильную помощь с разборками lazbarcodes
25 ноя 21, 08:23    [22400485]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить zlib от Deplhi с Lazarus  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 6645
dartveider13,

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

описалка

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

+
      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;


Сообщение было отредактировано: 25 ноя 21, 09:45
25 ноя 21, 09:43    [22400505]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Delphi Ответить