powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как подружить zlib от Deplhi с Lazarus
25 сообщений из 39, страница 1 из 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
25 сообщений из 39, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как подружить zlib от Deplhi с Lazarus
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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