Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Datei in Base64 konvertieren (https://www.delphipraxis.net/48851-datei-base64-konvertieren.html)

Brainshock 1. Jul 2005 09:09


Datei in Base64 konvertieren
 
Hallo,

kann mir jemand beschreiben bzw. einen Code Schnippsel geben, wie ich eine Datei (z.B. JPG, BMP) in einen Base64 String konvertiere um ihn in einer XML zu speichern?

Gruß
Matthias

barf00s 1. Jul 2005 09:19

Re: Datei in Base64 konvertieren
 
google ist dein freund
aber evtl hilft dir www.efg2.com/Lab

Brainshock 1. Jul 2005 10:55

Re: Datei in Base64 konvertieren
 
Sorry barf00s,

aber hilft mir irgendwie (noch) nicht.

Gruß
Matthias

marabu 1. Jul 2005 11:00

Re: Datei in Base64 konvertieren
 
Hallo Matthias,

für das Konvertieren kannst du auf Routinen hier aus der CodeLib zurückgreifen. Oder ist dein Problem das Erstellen bzw. Modifizieren einer XML-Datei?

Grüße vom marabu

Brainshock 1. Jul 2005 12:10

Re: Datei in Base64 konvertieren
 
Hi marabu,

meinst du diesen Code-Lib Post?

Base64 (MIME) En-/Decoding

Wie mache ich das nun aber mit einer Datei? Bitte gib mir einen Ansatz. Danke.

Gruß
Matthias

barf00s 1. Jul 2005 12:11

Re: Datei in Base64 konvertieren
 
du kannst deine datei innem Memorystream speichern und dann mit der .Memory eigenschaft rumspielen

Brainshock 1. Jul 2005 13:33

Re: Datei in Base64 konvertieren
 
Hier mein erster Versuch mit Hilfe von Base64Encode aus der Code-Library:

Delphi-Quellcode:
function Base64EncodeFile(AFileName: String; var ABase64Str: String): Boolean;
var
  ms: TMemoryStream;
  InSize, OutSize: Cardinal;
  PIn, POut: Pointer;
begin
  result:= False;
  ABase64Str:= '';
  if FileExists(AFileName) then
  begin
    with TMemoryStream.Create() do
    try
      LoadFromFile(AFileName);
      // get size of source
      InSize := Size;
      Position:= 0;
      // calculate size for destination
      OutSize := CalcEncodedSize(InSize);
      SetLength(ABase64Str, OutSize);
      // encode !
      PIn := Memory;
      POut:= @ABase64Str[1];
      Base64Encode(PIn, InSize, POut);
      result:= True;
    finally
      Free;
    end;
  end;
end;
Das mit dem dem "ABase64Str" für die Rückgabe haut aber irgendwie nicht hin.
Wäre nett, wenn das mal einer ausprobieren könnte und den Fehler findet.

Gruß
Matthias

Brainshock 3. Jul 2005 15:13

Re: Datei in Base64 konvertieren
 
Hi,

hat denn keiner Zeit das mal aus dem Post eins weiter oben zu probieren und/oder kann mir sagen wo der Fehler liegt?
Ich find ihn einfach nicht.

Danke und Gruß
Matthias

marabu 3. Jul 2005 16:30

Re: Datei in Base64 konvertieren
 
Hallo Matthias,

dein Code sieht in meinen Augen korrekt aus. Vielleicht möchte ja sakura etwas zur korrekten Handhabung seines Codes schreiben.

marabu

[edit]Bis dahin entferne mal die Zuweisung des empty string auf ABase64Str am Beginn deiner Funktion[/edit]

Brainshock 4. Jul 2005 08:11

Re: Datei in Base64 konvertieren
 
@marabu:

den Leerstring am Anfang habe ich entfernt und der Code läuft jetzt auch (irgendwie).
Hier noch das dekodieren, welches auch noch nicht richtig funktioniert:

Delphi-Quellcode:
function Base64DecodeFile(ABase64Str: String; AFileName: String): Boolean;
var
  InSize, OutSize: Cardinal;
  PIn, POut: Pointer;
begin
  result:= False;
  // get size of source
  InSize := Length(ABase64Str);
  // calculate size for destination
  PIn := @ABase64Str[1];
  OutSize := CalcDecodedSize(PIn, InSize);
  // prepare string length to fit result data
  with TMemoryStream.Create() do
  try
    SetSize(OutSize);
    POut := Memory;
    // decode !
    if Base64Decode(PIn, InSize, POut) then
    begin
      SaveToFile(AFileName);
      result:= True;
    end;
  finally
    Free;
  end;
end;
Fehler? :? :(

Gruß
Matthias

marabu 4. Jul 2005 08:52

Re: Datei in Base64 konvertieren
 
Dein Code ist in Ordnung und funktioniert bei mir. Wie und an welcher stelle macht sich bei dir ein Fehler bemerkbar?

marabu

Brainshock 4. Jul 2005 10:47

Re: Datei in Base64 konvertieren
 
Das Problem liegt direkt beim Dekodieren, die Rückgabe ist False und die Ausgabedatei wird deshalb nicht geschrieben.
POut ist bei der Übergabe nil, was wahrscheinlich das Problem ist.

@marabu: Hast du eine Idee ?

Gruß
Matthias

marabu 4. Jul 2005 11:02

Re: Datei in Base64 konvertieren
 
Wenn der Zeiger für den Ausgabepuffer schon nil ist, dann liegt es ja nicht am dekodieren. Du wirst mal ein wenig tracen müssen. Wenn POut nil ist, dann scheint Memory auch nil zu sein. Eventuell ist ja schon SetSize() wegen einer falschen Größenangabe fehlgeschlagen.

marabu

Brainshock 4. Jul 2005 11:11

Re: Datei in Base64 konvertieren
 
Hier mal meine Prozeduren (der Buttons) für das Kodieren und Dekodieren:

Kodieren:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
  INPUTFILE = 'C:\test.jpg';
  OUTPUTFILE = 'C:\test.b64';
var
  OutText: String;
begin
  Base64EncodeFile(INPUTFILE, Outtext);
  DeleteFile(OUTPUTFILE);
  with TFileStream.Create(OUTPUTFILE, fmCreate) do
  try
    Write(Outtext[1], Length(Outtext));
  finally
    Free;
  end;
end;
Dekodieren:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
const
  INPUTFILE = 'C:\test.b64';
  OUTPUTFILE = 'C:\out.jpg';
var
  InText: String;
begin
  with TFileStream.Create(INPUTFILE, fmOpenRead) do
  try
    Position:= 0;
    SetLength(InText, Size);
    Read(InText[1], Size);
  finally
    Free;
  end;
  Base64DecodeFile(InText, OUTPUTFILE);  // editiert: von Text -> InText geändert
end;
Vielleicht liegt hier auch noch ein Fehler.

Gruß
Matthias

Brainshock 4. Jul 2005 11:59

Re: Datei in Base64 konvertieren
 
@marabu: Es war noch ein kleiner Fehler in der Button2Click() Methode (siehe edit-Kommentar) und jetzt funktioniert es auch. Danke.

:-D

Gruß
Matthias


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:25 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