Thema: Delphi DEC 5.1 wie benutzen?

Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#7

Re: DEC 5.1 wie benutzen?

  Alt 3. Feb 2008, 12:07
Zur Beantwortung deiner Frage würde ich die Unit DECCipher.pas öffnen und im Interfaceteil der Unit nach der Deklaration von TDECCipher.EncodeStream() suchen.

Du findest dann das hier

Delphi-Quellcode:
    
procedure EncodeStream(const Source, Dest: TStream; const DataSize: Int64; const Progress: IDECProgress = nil);
Danach würde ich in die Implementierung dieser Funktion gehen und du findest den Aufruf der internen Procedure DoCodeStream(). Diese Proc ist in Pascal geschrieben und damit eigentlich auch lesbar

DataSize bezeichnet also die Anzahl an Bytes die aus Stream "Source" nach "Dest" verschlüsselt werden sollen. Man kann mit DEC's Streamfunktionen, bzw. eigentlich mit fast allen Streamfunktionen die halbwegs logisch aufgebaut sind, auch nur Teile einen Streams verschlüsseln. Zb. man ver-entschlüsselt ab dem 1000 Bytes eines Streams nur 100 Bytes nach Dest. Dazu wird Stream.Position benutzt.

Wenn man zb. ab .Position := 1000 alles bis .Size = 1500 aus einem TFileStream verschlüsseln möchte müsste man es so aufrufen:

Delphi-Quellcode:
  Source.Position := 1000;
  EncodeStream(Source, Dest, Source.Size - Source.Position);
Das Subtrahieren von .Size - .Position verlangt aber beim TFileStream ständige Aufrufe von .Seek(). Nun Seek() wiederum nutzt das Windows-FileAPI und das ist speziell bei .Seek() arsch langsam. Dh. wenn man Dateioperationen möglichst schnell haben möchte dann sollte man die Aufrufe von .Size und .Position reduzieren und optimieren.

Nun der Aufruf von

Delphi-Quellcode:
  Source.Position := 1000;
  EncodeStream(Source, Dest, -1);
ist identisch zu obigem Aufruf, spart aber zwei Aufrufe von .Seek() da wir .Size und .Position nicht mehr aufrufen.

Die -1 bedeutet also: ver/entschlüssele alles von der aktuellen .Position bis zum Ende des Stream's = .Size.

Zudem fängt es Fehler ab. Wenn zb. Source.Positon und/oder Soure.Size vom Programierer in lokalen Variablen selber berechnet wird (siehe meine Implementation von DoCodeSream) und dabei aber falsch berechnet wurde so das Position > Size wäre so ergibt sich ein negativer Wert von DataSize. In diesem Falle fängt das DoCodeStream() ab und berechnet selber die Anzahl an Bytes von .Position bis .Size des Streams.

Gruß Hagen
  Mit Zitat antworten Zitat