![]() |
Base64Encode funktioniert nicht
Hallo,
Ich verstehe gerade nicht das Problem. Folgendes:
Delphi-Quellcode:
An der markierten Stelle kracht es. Außerdem stehen in tmp nach Base64Encode nur 0-Bytes.
procedure Beispiel(AStream: TMemoryStream);
var tmp: TMemoryStream; begin tmp := TMemoryStream.Create; try tmp.SetSize(CalcEncodedSize(AStream.Size)); Base64Encode(AStream.Memory^,AStream.Size,tmp.Memory^); AStream.Clear; // <-- AStream.Write(tmp.Memory^,tmp.Size); finally tmp.Free; end; end; Was mache ich denn falsch? Gruß Neutral General |
AW: Base64Encode funktioniert nicht
Hallo Michael,
eigentlich müsste es in der Zeile davor "gekracht" haben, wenn ich deinen Code mit anderen Beispielen hier in der DP vergleiche. Grüße vom marabu |
AW: Base64Encode funktioniert nicht
Hallo,
Also ich benutze diese Überladung von Base64Encode:
Delphi-Quellcode:
procedure Base64Encode(const InBuffer; InSize: Cardinal; var OutBuffer);
Was ist denn das Problem? |
AW: Base64Encode funktioniert nicht
Die von Dir verwendete Überladung war klar zu sehen.
Ich hatte die DP nach Base64Encode durchsucht und ![]() Du dereferenzierst Memory, Matthias nicht. Dieser Unterschied könnte über Erfolg und Misserfolg entscheiden. |
AW: Base64Encode funktioniert nicht
Ja.. den Beitrag habe ich schon gesehen.
Allerdings müsste seine Übergabe (ohne Dereferenzierung) falsch sein. Was ich grade feststelle: Mit und ohne Dereferenzierung ist nach dem Aufruf AStream = nil :shock: |
AW: Base64Encode funktioniert nicht
Zitat:
Delphi-Quellcode:
var
p: Pointer; {...} p := tmp.Memory; Base64Encode(AStream.Memory, AStream.Size, p); |
AW: Base64Encode funktioniert nicht
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:
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:
const
PASSWORD = 'top*secret'; var b64: string; begin b64 := Base64Encode(PASSWORD); Base64Encode(PASSWORD, b64); end;
Delphi-Quellcode:
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.// 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; Freundliche Grüße |
AW: Base64Encode funktioniert nicht
Base64Encode der zweite Paramaeter steht in EDX.
Richtig so:
Code:
Der Rückgabewert von Base64Decode wird nicht gesetzt, wenn ein leerer String übergeben wird.
// load InSize (stored in EDX)
mov EAX, InSize Richtig so:
Code:
Edit:
mov EAX, InSize
shr EAX, 2 jz @@SuccessDone ![]() Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:35 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