Ich habe die Version 1.2 der
Unit Base64 von sakura auf meiner Festplatte gefunden und ein paar Tests unterzogen. Vielleicht stelle ich mich momentan etwas ungeschickt an, aber das war dann damals, als ich Matthias unterstützen wollte, genau so.
Delphi-Quellcode:
const
PASSWORD = 'top*secret';
var
b64: string;
begin
b64 := Base64Encode(PASSWORD);
Base64Encode(PASSWORD, b64);
end;
Die beiden Aufrufe produzieren identische Ergebnisse. Der Code im Eröffnungsbeitrag dieses Threads verwendet Base64Encode mit der Signatur (const InBuf; InSize: Cardinal; var OutBuf). Das machen die beiden Aufrufe von mir intern auch. Ich habe deshalb den entsprechenden Code aus der
Unit BASE64 extrahiert und ein wenig damit gespielt:
Delphi-Quellcode:
// das ist der Code von sakura
procedure Base64Encode(const InText: string; var OutText: string);
var
InSize, OutSize: Cardinal;
PIn, POut: Pointer;
begin
InSize := Length(InText);
OutSize := CalcEncodedSize(InSize);
SetLength(OutText, OutSize);
PIn := @InText[1];
POut := @OutText[1];
Base64Encode(PIn, InSize, POut);
end;
// hier habe ich den Ausgabepuffer lokal deklariert und gebe das
// Ergebnis im Eingabepuffer zurück. Allerdings verwende ich einen
// string und keinen MemoryStream.
procedure Base64(var InText: string);
var
InSize, OutSize: Cardinal;
PIn, POut: Pointer;
OutText: string;
begin
InSize := Length(InText);
OutSize := CalcEncodedSize(InSize);
SetLength(OutText, OutSize);
PIn := @InText[1];
POut := @OutText[1];
Base64Encode(PIn, InSize, POut);
InText := OutText;
end;
Die erste Prozedur funktioniert, wie von mir erwartet. Die zweite Prozedur funktioniert auf meinem Testsystem nicht. In EBX wird nicht die Länge übergeben, sondern ein Zeiger. Das führt, vermutlich wegen des viel zu hohen Wertes, zu aberwitzigen Folgefehlern. Für die weitere Untersuchung dieses Problems fehlen mir leider Motivation und Zeit. Vielleicht möchte sich jemand damit beschäftigen, der sich besser mit dem Inline-Assembler von Delphi auskennt.
Freundliche Grüße