Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как подружить zlib от Deplhi с Lazarus / 25 сообщений из 39, страница 1 из 2
23.11.2021, 08:39
    #40114057
dartveider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить zlib от Deplhi с Lazarus
Доброго всем дня! На данный момент у меня существует программка, которая формирует строку, затем сжимает ее с помощью библиотеки zlib функцией ZCompressStr и запихивает получившееся в двухмерный штрих-код.
Другая программка соответственно при считывании кода, распаковывает сжатую строку и производит с ней дальнейшие действия.
Теперь, ту первую программку я пытаюсь перевести в кросс-платформу для работы ее на линуксе, zlib от делфей воткнуть в лазарь у меня не получилось. В стандартной библиотеке zlib в лазаре нет функции ZCompressStr. Вот и получается, что я пока не знаю как мне подружить сжатие строки и дальнейшую распаковку ее zlib-ом делфей. Что можете подсказать по данному вопросу?
...
Рейтинг: 0 / 0
23.11.2021, 08:57
    #40114060
LuciferNovoros
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить zlib от Deplhi с Lazarus
...
Рейтинг: 0 / 0
23.11.2021, 09:06
    #40114063
dartveider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить zlib от Deplhi с Lazarus
LuciferNovoros, пробежался по коду модуля. Вроде что-то похожее на правду. Мне главное, чтобы в линуксе она взлетела и потом распаковалась злибом в делфи программе. Будем пробовать. Спасибо. Отпишусь о результатах как попробую
...
Рейтинг: 0 / 0
23.11.2021, 10:42
    #40114090
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить zlib от Deplhi с Lazarus
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
23.11.2021, 12:34
    #40114118
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить zlib от Deplhi с Lazarus
dartveider13,
paszlib
unzip
FreePascalArchivePackage
abbrevia

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

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

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

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

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

Последовательно, пока inflate не вернёт тебе Z_STREAM_END.
...
Рейтинг: 0 / 0
23.11.2021, 17:30
    #40114258
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить zlib от Deplhi с Lazarus
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
24.11.2021, 07:37
    #40114416
dartveider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить zlib от Deplhi с Lazarus
Kazantsev Alexey, попробовал на тестовом проекте. Вылетает пустая ошибка. ШК исчезает с радаров
...
Рейтинг: 0 / 0
24.11.2021, 07:49
    #40114419
dartveider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить zlib от Deplhi с Lazarus
гемор какой-то с этими lazbarcodes, сложно готовятся))) На делфе я использовал библиотеку aztecgen. Он в объект TImage рисовал код. Может есть что-то подобное?
...
Рейтинг: 0 / 0
24.11.2021, 08:12
    #40114422
dartveider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить zlib от Deplhi с Lazarus
Или может быть вариант задействовать библиотеку lazbarcodes, но генерировать код не на компоненте а в картинке?
...
Рейтинг: 0 / 0
24.11.2021, 10:28
    #40114443
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить zlib от Deplhi с Lazarus
Что мешает портировать ацтекген под лазаря?
...
Рейтинг: 0 / 0
24.11.2021, 10:54
    #40114450
dartveider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить zlib от Deplhi с Lazarus
Fr0sT-Brutal, исходник этой либы написан как я понимаю на плюсах, я в них не очень. Тут как я понимаю надо попробовать собрать его в линуксе? Что получится фиг знает. С инета я взял его и скомпиленой длл-кой
...
Рейтинг: 0 / 0
24.11.2021, 11:22
    #40114463
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить zlib от Deplhi с Lazarus
dartveider13
попробовал на тестовом проекте. Вылетает пустая ошибка. ШК исчезает с радаров

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

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



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

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

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

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

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

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

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


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