uses
ZLib;
{ Compress a stream }procedure CompressStream(inpStream, outStream: TStream);
var
InpBuf, OutBuf: Pointer;
InpBytes, OutBytes: Integer;
begin
InpBuf := nil;
OutBuf := nil;
try
GetMem(InpBuf, inpStream.Size);
inpStream.Position := 0;
InpBytes := inpStream.Read(InpBuf^, inpStream.Size);
CompressBuf(InpBuf, InpBytes, OutBuf, OutBytes);
outStream.Write(OutBuf^, OutBytes);
finallyif InpBuf <> nilthen FreeMem(InpBuf);
if OutBuf <> nilthen FreeMem(OutBuf);
end;
end;
{ Decompress a stream }procedure DecompressStream(inpStream, outStream: TStream);
var
InpBuf, OutBuf: Pointer;
OutBytes, sz: Integer;
begin
InpBuf := nil;
OutBuf := nil;
sz := inpStream.Size - inpStream.Position;
if sz > 0 thentry
GetMem(InpBuf, sz);
inpStream.Read(InpBuf^, sz);
DecompressBuf(InpBuf, sz, 0, OutBuf, OutBytes);
outStream.Write(OutBuf^, OutBytes);
finallyif InpBuf <> nilthen FreeMem(InpBuf);
if OutBuf <> nilthen FreeMem(OutBuf);
end;
outStream.Position := 0;
end;
{
Example:
Compress the contents of RichEdit1 and
calculate the compression rate.
Then save the stream to a file (ms2.dat)
Beispiel:
Komprimiert den Inhalt von RichEdit1 und
berechnet die Kompressionsrate.
Dann wird der Stream in eine Datei (ms2.dat) gespeichert.
}procedure TForm1.Button1Click(Sender: TObject);
var
ms1, ms2: TMemoryStream;
begin
ms1 := TMemoryStream.Create;
try
ms2 := TMemoryStream.Create;
try
RichEdit1.Lines.SaveToStream(ms1);
CompressStream(ms1, ms2);
ShowMessage(Format('Stream Compression Rate: %d %%',
[round(100 / ms1.Size * ms2.Size)]));
ms2.SaveToFile('C:\ms2.dat');
finally
ms1.Free;
end;
finally
ms2.Free;
end;
end;
{
Loads the stream from a file (ms2.dat)
and decompresses it.
Then loads the Stream to RichEdit1.
Ladt den komprimierten Stream von einer Datei (ms2.dat)
und dekomprimiert ihn.
Dann wird der Stream wieder in RichEdit1 geladen.
}procedure TForm1.Button2Click(Sender: TObject);
var
ms1, ms2: TMemoryStream;
begin
ms1 := TMemoryStream.Create;
try
ms2 := TMemoryStream.Create;
try
ms1.LoadFromFile('C:\ms2.dat');
DecompressStream(ms1, ms2);
RichEdit1.Lines.LoadFromStream(ms2);
finally
ms1.Free;
end;
finally
ms2.Free;
end;
end;
Программный код, предоставленный вами, - это приложение на Delphi, которое использует библиотеку ZLib для сжатия и распаковки потоков. Код состоит из трех процедур: CompressStream, DecompressStream и двух обработчиков событий для кнопок.
Процедура CompressStream
Эта процедура принимает два параметра, inpStream и outStream, которые являются экземплярами класса TStream. Она читает содержимое inpStream, сжимает его с помощью функции ZLib'а CompressBuf и записывает сжатые данные в outStream.
Процедура DecompressStream
Также эта процедура принимает два параметра, inpStream и outStream, которые являются экземплярами класса TStream. Она читает сжатые данные из inpStream, распаковывает их с помощью функции ZLib'а DecompressBuf и записывает распакованное содержимое в outStream.
Обработчик события Button1Click
Эта процедура сжимает содержимое RichEdit-контроля (RichEdit1) и рассчитывает коэффициент сжатия. Сжатый поток затем сохраняется в файле "ms2.dat".
Обработчик события Button2Click
Эта процедура загружает сжатый поток из файла "ms2.dat", распаковывает его и загружает полученное содержимое в RichEdit1.
Вот некоторые предложения по улучшению кода:
Вместо использования raw-пунктирных указателей и функций управления памятью, таких как GetMem и FreeMem, рекомендуется использовать встроенный класс Delphi TMemoryStream для управления потоками.
Можно использовать компонент Delphi TCompression, который предоставляет более удобный интерфейс для сжатия и распаковки данных.
Рекомендуется добавить обработку ошибок в процедурах, если они могут возникнуть при сжатии или распаковке данных.
Код не является потоко-безопасным. Если планируется использовать код в многопоточной среде, рекомендуется использовать механизмы синхронизации, такие как мьютексы или критические секции для защиты доступа к общим ресурсам.
В целом, код выглядит чистым и хорошо организованным, но может улучшиться в отношении управления памятью и обработки ошибок.
Сжимаем и разжимаем потоки: демонстрируются примеры использования библиотеки ZLib для сжатия и декомпрессии потоков в приложении на языке Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.