Avatar billede rrm Nybegynder
17. april 2004 - 15:14 Der er 5 kommentarer og
1 løsning

Angående at få "data fra en pointer"

Davs.

I forbindelse med noget kompimering, har jeg pointer der peger på noget data, dette data skal jeg havde gemt i en fil. For øjeblikket kopiere jeg data til en streng og gemmer så den:

tmp2 (integer) := sizeOf(CompressInfo.header);
tmp3 (pointer) := @CompressInfo.header;
        // Compressing the header.
ZCompress(tmp3, sizeOf(CompressInfo.header),
          compressBuffer (pointer), compressBufferSize (integer));
setlength(stmp (string), compressbuffersize);
move(compressbuffer^, pointer(stmp)^,compressBufferSize);

Jeg havde forstillet mig at bruge en buffer med fast størrelse, og så gemme det af flere omgange hvis compressBufferSize > bufferen. Mit spørgsmål er så hvordan får man fat på resten af det pointeren peger på??.
F.eks. hvis bufferen har 10 pladser og det kompimerede skal bruge 15, hvordan henter man så det sidste 5 byte data???

På forhånd tak
rrm
Avatar billede hrc Mester
20. april 2004 - 11:07 #1
Den komprimeringskomponent du bruger, har den ikke nogen streaming funktionalitet?

Hvis det er PassZLib.pas du bruger?

{*****************************************************************************
*  ZLib.pas                                                                  *
*  copyright (c) 2000 base2 technologies                                    *
*  copyright (c) 1997 Borland International                                  *
*                                                                            *
*  revision history                                                          *
*    2000-06-13  optimized, fixed, rewrote, and enhanced the zlib.pas unit  *
*                  included on the delphi cd (zlib version 1.1.3)            *
*****************************************************************************}

const
  ZLIB_VERSION = '1.1.3'; // eller lignende...

.. så har den mulighed for at streame hvis du bruger klassen.


TZCompressionStream = class(TCustomZStream)
private
  function GetCompressionRate: Single;
public
  constructor Create(dest: TStream; compressionLevel: TZCompressionLevel = zcDefault);
  destructor  Destroy; override;
  function  Read(var buffer; count: Longint): Longint; override;
  function  Write(const buffer; count: Longint): Longint; override;
  function  Seek(offset: Longint; origin: Word): Longint; override;
  property CompressionRate: Single read GetCompressionRate;
  property OnProgress;
end;

Her er der en dest-stream, men hvor dælen er source? Det kan jeg ikke lige se.

I øvrigt synes jeg din kode ovenfor ser lidt mistænkelig ud. Har du mulighed for at sende lidt mere kode?

Kan ellers anbefale dig at prøve nogle af de komponenter der findes på markedet. Har gode erfaringer med DynaZip og mener at den må hentes gratis (til private formål), men er ikke sikker.

Prøv at se her:

http://www.delphipages.com/skunkworks/swcompress.html
http://www.nomssi.de/paszlib/paszlib.html
Avatar billede rrm Nybegynder
20. april 2004 - 11:35 #2
jeg bruger et component der hedder ZLibEx af Roberto Della Pasqua til komprimeringen. Den er en (videre???) udbyggelse af borland unit. Jeg bruger også TStream til at komprimere selve fil dataen, men forsørger at bruger en buffer til at komprimere nogle headers.

For øjeblikket er koden forfærteligt rodet, så jeg tror ikke hjælpe ret meget.
Avatar billede hrc Mester
20. april 2004 - 17:31 #3
Måske kan du bruge dette eksempel. Der kopieres en fil vha. to streams, men der overføres imellem dem vha. en fast buffer:

procedure TForm1.btnTestClick(Sender: TObject);
var
  Buffer : pointer;
  ReadSize : integer;
  IFs : TFileStream;
  OFs : TFileStream;
begin
  GetMem(Buffer,BufferSize);
  IFs := TFileStream.Create(SrcFileName,fmOpenRead);
  Ofs := TFileStream.Create(DstFileName,fmCreate);
  try
    ReadSize := BufferSize;
    while IFs.Position < IFs.Size do begin
      if IFs.Position + BufferSize > IFs.Size then
        ReadSize := IFs.Size - IFs.Position; // Adjust final read
      IFs.Read(Buffer,ReadSize);
      OFs.Write(Buffer,ReadSize);
    end; // while
  finally
    Ofs.Free;
    IFs.Free;
    FreeMem(Buffer,BufferSize);
  end; // try
end;
Avatar billede rrm Nybegynder
21. april 2004 - 17:32 #4
Jeg bruger en ligende metode til at pakke filerne, tænkte på om der ikke er en anden løsning til. Idet det data der skal pakkes ikke er vild store, men dog stadig ubegrændset...
Avatar billede rrm Nybegynder
28. april 2004 - 18:50 #5
Er der andre der har en løsning???
Avatar billede rrm Nybegynder
24. maj 2004 - 21:07 #6
lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester