Einzelnen Beitrag anzeigen

marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

AW: Base64Encode funktioniert nicht

  Alt 21. Jan 2011, 07:50
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
  Mit Zitat antworten Zitat