Einzelnen Beitrag anzeigen

Achim Kalwa

Registriert seit: 2. Apr 2005
Ort: Lienen
110 Beiträge
 
Delphi 12 Athens
 
#8

AW: Speichermüll bei Base64Encode auf einem PC

  Alt 31. Jan 2022, 11:33
Anbei ein ganz simples Beispiel.
Dazu 2 exe Dateien von 2 verschiedenen Delphi XE4 Versionen.
Die Ausgabe von "testBase64Encode_fehler.exe" sieht wie ein Unicode-Problem aus

Compiliert mit Delphi 11.0 scheint das Demo-Projekt erst einmal zu funktionieren, zumindest solange man sich bei der Eingabe auf den ASCII-Zeichensatz beschränkt. Sobald deutsche Umlaute oder Sonderzeichen ins Spiel kommen, funktioniert der Code in BASE64Codec.pas nicht mehr wie erwartet, denn base64encode() verwendet einen AnsiString. Ich bekomme an dieser Stelle auch eine Compiler-Warnung:
"W1058 Implicit string cast with potential data loss from 'TCaption' to 'AnsiString'".

Base64 dient ja in erster Linie dazu, 8-Bit-Binärdateien (Bytes) in eine Zeichenfolge zu verwandeln, die nur aus lesbaren, Codepage-unabhängigen ASCII-Zeichen besteht. Um einen String (also Text) in Base64 zu codieren, muss also zunächst der Text in Bytes umgewandelt werden; und genau dieser Schritt fehlt in der verwendeten Unit BASE64Codec.pas. Die Historie in BASE64Codec.pas legt nahe, dass die letzten Änderungen/Anpassungen 2004 erfolgt sind; seit Delphi 2009 ist String aber WideString und der Code müsst angepasst werden. Evtl. liest Daniel hier ja mit und kann evtl. eine modernisierte Version zur Verfügung stellen.

Andererseits gibt es seit Delphi 10 die RTL-Unit System.NetEncoding.pas; dort gibt es die Klasse TBase64Encoding, die per class function verwendet werden kann und korrekte Ergebnisse liefert:

Edit2.Text := TNetEncoding.Base64.Encode(Edit1.Text);

HTH
Achim
Achim
  Mit Zitat antworten Zitat