[fpc-pascal] How to use TCompressionStream?

Felipe Monteiro de Carvalho felipemonteiro.carvalho at gmail.com
Sat Jun 21 19:34:06 CEST 2008


On Sat, Jun 21, 2008 at 2:27 PM, Michael Van Canneyt
<michael at freepascal.org> wrote:
> Call Compressor.flush first, only then all data will be in dest.
> This is done automatically when it is destroyed:

There is no Compressor.Flush. But freeing it seams to work.

Now I am having trouble using TDecompressor. Should I use CopyFrom
from another stream to get the decompressed data? This crashes the
app. Also, CopyFrom expects the size, but I have no size ... I just
want everything!

program stringcompressor;

{$apptype console}

uses
  Classes, SysUtils, zstream;

const
  Str_Original_String = 'The string to be compressed';
var
  Compressor: TCompressionStream;
  Decompressor: TDecompressionStream;
  StringStream: TStringStream;
  CompressedData: TMemoryStream;
  i: Integer;
begin
  WriteLn('The string to be compressed is: ', Str_Original_String);

  StringStream := TStringStream.Create(Str_Original_String);
  CompressedData := TMemoryStream.Create();
  Compressor := TCompressionStream.Create(clDefault, CompressedData);
  Decompressor := TDecompressionStream.Create(CompressedData);

  { Compress the string }
  Compressor.CopyFrom(StringStream, StringStream.Size);
  Compressor.Free;

  { Write the compressed string to the console }
  Write('The compressed data is: ');
  CompressedData.Position := 0;
  for i := 0 to CompressedData.Size - 1 do
    Write(IntToHex(CompressedData.ReadByte, 2));
  WriteLn('');

  { Decompress the string }
  StringStream.Size := 0;
  StringStream.CopyFrom(Decompressor, Decompressor.Size); // <----  crash
  WriteLn('The string after being compressed and decompressed is: ',
StringStream.DataString);

  Decompressor.Free;
  CompressedData.Free;
  StringStream.Free;
end.



More information about the fpc-pascal mailing list