Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   EncodeBase64 Problem mit Filestream (https://www.delphipraxis.net/213112-encodebase64-problem-mit-filestream.html)

DelphiUser123 27. Mai 2023 02:26

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;

Dalai 27. Mai 2023 02:53

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: https://stackoverflow.com/questions/...decode-base-64

Die Freigabe des Streams innerhalb der Schleife solltest du dringend überdenken.

Grüße
Dalai

KodeZwerg 22. Jun 2023 09:19

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;

Uwe Raabe 22. Jun 2023 09:47

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