Entwickler-Ecke

Dateizugriff - Stream als String?


Slowmo - Do 19.01.06 19:02
Titel: Stream als String?
Ich verzweifel hier bald ... ich möchte einen Stream als String auslesen, den String in ein Bitmap verschlüsseln, die Bitmap speichern, später wieder laden entschlüsseln und den String in einen Stream speichern, doch irgendwie will das nicht funktionieren. Hier mal der Quellcode:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure EncryptStream(Source, Dest: TStream; cl:Byte);
var s: string;
    Buffer: TBitmap;
begin
SetLength(s, Source.size);
Source.Read(pChar(s)^, Source.size);
Buffer:=TBitmap.Create;
Buffer:=Encrypt(s, cl);
Buffer.SaveToStream(Dest);
Buffer.Free;
end;

procedure DecryptStream(Source, Dest: TStream; cl:Byte);
var Buffer: TBitmap;
         s: String;
begin
Buffer:=Tbitmap.Create;
Buffer.LoadFromStream(Source);
s:=Decrypt(Buffer, cl);
Buffer.Free;
Dest.Write(s, length(s));
end;


Die Verschlüssel- und Entschlüsselfunktionen funktioieren einwandfrei (getestet), es muss also an diesem Stück Quellcode liegen.


Heiko - Do 19.01.06 19:13

Hast du es schon eimal ohne Zeigern probiert? Denn da liegt manchmal eine Fehlerquelle. Wenn man einfache Strings nimmt, muss man noch den Zeiger auf das erste Zeichen setzten (ich weiß nicht, ob dein Zeiger hier auf den 0 oder 1 Byte zeigt, da ja das 0 für die Länge reserviert ist).


BenBE - Do 19.01.06 19:27
Titel: Re: Stream als String?
Probier mal:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
procedure EncryptStream(Source, Dest: TStream; cl:Byte);
var
    s: string;
    Buffer: TBitmap;
begin
    SetLength(s, Source.size);
    Source.Read(s[1], Source.size);
    //Buffer:=TBitmap.Create; //Nicht benötigt: Speicherleck!!!
    Buffer:=Encrypt(s, cl);
    try
        Buffer.SaveToStream(Dest);
    finally
        Buffer.Free;
    end;
end;

procedure DecryptStream(Source, Dest: TStream; cl:Byte);
var
    Buffer: TBitmap;
    s: String;
begin
    Buffer:=TBitmap.Create;
    try
        Buffer.LoadFromStream(Source);
        s:=Decrypt(Buffer, cl);
    finally
        Buffer.Free;
    end;
    Dest.Write(s[1], length(s));
end;


Falls er bei s[1] meckert: Einfach ein @ davor ergänzen --> @s[1] ...


Slowmo - Do 19.01.06 19:41

Also das hat leider nichts geändert, die beiden Stream sind am Ende immer nocht nicht die selben...


WASEO - Do 19.01.06 19:43

Die Methode mit dem Buffer ist etwas umständlich. Wesentlich einfacher geht's mit TStringStream. Der hat die Eigenschaft DataString, in welcher der gesamte Stream als String abgelegt ist. Den Inhalt ann man dann leicht einem String zuweisen und ver- bzw. entschlüsseln und zu weiteren Zwecken verwenden.

Ansonsten schaumalguckeda:

http://www.swissdelphicenter.ch/de/showcode.php?id=1268


Slowmo - Fr 20.01.06 18:17

Hat sich inzwischen erledigt, ich steig dabei zwar nich ganz durch, es muss aber am Speichern der Bitmap in einen Stream gelegen haben. Jetzt speicher ich die bitmap einfach in einer Datei und es funktioniert.

Trotzdem: Danke für die Hilfe.