Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Сжимаем и разжимаем потоки

Delphi , Компоненты и Классы , Потоки

Сжимаем и разжимаем потоки


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); 
  finally 
    if InpBuf <> nil then FreeMem(InpBuf); 
    if OutBuf <> nil then 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 then  
    try 
      GetMem(InpBuf, sz); 
      inpStream.Read(InpBuf^, sz); 
      DecompressBuf(InpBuf, sz, 0, OutBuf, OutBytes); 
      outStream.Write(OutBuf^, OutBytes); 
    finally 
      if InpBuf <> nil then FreeMem(InpBuf); 
      if OutBuf <> nil then 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Потоки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 14:22:36/0.0054738521575928/1