![]() |
Speichermüll bei Base64Encode auf einem PC
Moin,
wir haben das Problem das auf einem unserer Rechner beim übersetzen in Delphi XE4 bei Base64Encode Speichermüll entsteht. Wir setzen die Base64Codec unit von Daniel Wischnewski ein. Die Unit hat zwar schon paar Jahre auf dem Buckel, aber hat immer funktioniert. Nun sind wir darüber gestolpert das bei einem Delphi XE4 wenn die Programm darin übersetzt werden die Funktion Base64Encode Speichermüll zurückgibt. D.h es kommt wirklich irgendwas aus dem Speicher zurück. Teilweise stehen dort Teile von SQL Code drin. Die Funktion selber ist in Assembler programmiert. Wir sind auch soweit alle Compilereinstellungen durch und die sind identisch. Bin gerade etwas überfragt und evtl hat einer eine Idee. Gruß Sven |
AW: Speichermüll bei Base64Encode auf einem PC
Hast Du ein Demoprojekt mit Daten?
|
AW: Speichermüll bei Base64Encode auf einem PC
Liste der Anhänge anzeigen (Anzahl: 1)
Anbei ein ganz simples Beispiel.
Dazu 2 exe Dateien von 2 verschiedenen Delphi XE4 Versionen. |
AW: Speichermüll bei Base64Encode auf einem PC
Compilers.inc fehlt in dem zip file. Ich habe die mal entfernt und stattdessen
Delphi-Quellcode:
eingefügt. Das Codieren funktioniert ohne "Speichermüll", Allerdings mit 10.3. Wenn der Fehler nur beim Compilieren auf einem Rechner auftritt, könnte dort evtl. ein anderer Memory Manager verwendet worden sein? Vergleich doch mal die MAP-Files.
{$define COMPILER_6_UP}
|
AW: Speichermüll bei Base64Encode auf einem PC
Nur eine erste Sichtkontrolle, aber StrAlloc gibt einen PChar zurück - unter XE4 also einen PWideChar. Keine Ahnung, ob das damit zu tun hat.
Delphi-Quellcode:
// reserve memory
OutText := PAnsiChar(StrAlloc(Succ(OutSize))); OutText[OutSize] := #0; |
AW: Speichermüll bei Base64Encode auf einem PC
Zitat:
|
AW: Speichermüll bei Base64Encode auf einem PC
das wirkt doch wie ein unicode Problem oder?
ich dachte es würde an NEXTGEN liegen aber das ist identisch. die .MAP Dateien sehen für mich gleich aus. ein Diff bringt nichts, weil jede Zeile durch die Speicherangaben unterschiedlich ist. |
AW: Speichermüll bei Base64Encode auf einem PC
Zitat:
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 |
AW: Speichermüll bei Base64Encode auf einem PC
Wir haben das Problem gefunden.
Mein Kollege hatte eine Kopie unseres Units Ordners und diese auch noch im Suchpfad und zwar über unserem Ordner. Bitte keine weiteren Fragen :-) Das ist nun aufgefallen weil ich für das Projekt hier die Base64Codec.pas in das gleich Verzeichnis gepackt habe. Er hatte dann das Projekt über GIT gezogen und danach trat der Fehler nicht mehr auf. |
AW: Speichermüll bei Base64Encode auf einem PC
Zitat:
|
AW: Speichermüll bei Base64Encode auf einem PC
Zitat:
Blöd ist halt, dass hier mehr Speicher alloziert wird als benötigt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 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 by Thomas Breitkreuz