![]() |
EncodeBase64 Problem mit Filestream
Hallo zusammen. Ich habe eine Binary Datei deren Daten ich umwandeln möchte in Zahlen. Die Position des Filestreams wird immer um eins größer. Jedoch wird die neue Position nicht von "EncodeBase64" erkannt. Er spuckt stets nur die selbe Zahl aus, der Ausgabestring von "EncodeBase64" ist dementsprechend auch immer gleich.
Vielen Dank für Antworten. Hier mein Code:
Code:
function GetNewData(): integer;
var AFileStream : TFileStream; rohwert : AnsiString; pfad,AFilename: string; begin pfad:=ExtractFilePath(ParamStr(0)); AFilename:= pfad + 'data.bin'; AFileStream := TFileStream.Create(AFilename, fmOpenRead); repeat try AFileStream.Position:=StreamPosition; rohwert:=EncodeBase64(AFileStream, 1); zufallswert := ord(rohwert[1]); StreamPosition:=StreamPosition+1; showmessage(inttostr(zufallswert)); showmessage(inttostr(StreamPosition)); showmessage(rohwert); finally AFileStream.Free; end; until (1 < zufallswert) and (zufallswert <= 50); Result:=zufallswert; end; |
AW: EncodeBase64 Problem mit Filestream
EncodeBase64 erwartet einen Pointer auf Daten, keinen Stream. Bei StackOverflow gibt's ein Beispiel, bei dem mit TMemoryStream gearbeitet wird:
![]() Die Freigabe des Streams innerhalb der Schleife solltest du dringend überdenken. Grüße Dalai |
AW: EncodeBase64 Problem mit Filestream
Hab mal spaßenshalber ChatGPT befragt und er hat mir damit geantwortet, schaut schlüssig für mich aus.
Code:
function EncodeFileToBase64(const ASourceFile, ATargetFile: string): Boolean;
var SourceStream: TFileStream; TargetStream: TStringStream; begin Result := False; SourceStream := TFileStream.Create(ASourceFile, fmOpenRead or fmShareDenyWrite); try TargetStream := TStringStream.Create('', TEncoding.ASCII); try TNetEncoding.Base64.Encode(SourceStream, TargetStream); TargetStream.SaveToFile(ATargetFile); finally TargetStream.Free; end; finally SourceStream.Free; Result := True; end; end; function DecodeFileFromBase64(const ASourceFile, ATargetFile: string): Boolean; var SourceStream: TStringStream; TargetStream: TFileStream; begin Result := False; SourceStream := TStringStream.Create('', TEncoding.ASCII); try SourceStream.LoadFromFile(ASourceFile); TargetStream := TFileStream.Create(ATargetFile, fmCreate); try TNetEncoding.Base64.Decode(SourceStream, TargetStream); finally TargetStream.Free; end; finally SourceStream.Free; Result := True; end; end; |
AW: EncodeBase64 Problem mit Filestream
Warum die unterschiedliche Vorgehensweise bei Encode und Decode (abgesehen von der eigentlich Aktion)?
Beim Lesen aus dem FileStream und anschließenden Schreiben des StringStreams im Encode gibt es Probleme wenn ASourceFile und ATargetFile auf dieselbe Datei verweisen. Beim Decode passiert das nicht. Daher würde ich beim Encode wie beim Decode in einen StringStream lesen und in einen FileStream schreiben. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz