AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Base64Encode funktioniert nicht

Ein Thema von Neutral General · begonnen am 20. Jan 2011 · letzter Beitrag vom 21. Jan 2011
Antwort Antwort
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Base64Encode funktioniert nicht

  Alt 20. Jan 2011, 09:04
Hallo,

Ich verstehe gerade nicht das Problem. Folgendes:

Delphi-Quellcode:
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;
An der markierten Stelle kracht es. Außerdem stehen in tmp nach Base64Encode nur 0-Bytes.
Was mache ich denn falsch?

Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
marabu

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

AW: Base64Encode funktioniert nicht

  Alt 20. Jan 2011, 12:38
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
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Base64Encode funktioniert nicht

  Alt 20. Jan 2011, 12:45
Hallo,

Also ich benutze diese Überladung von Base64Encode:

procedure Base64Encode(const InBuffer; InSize: Cardinal; var OutBuffer);

Was ist denn das Problem?
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
marabu

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

AW: Base64Encode funktioniert nicht

  Alt 20. Jan 2011, 12:57
Die von Dir verwendete Überladung war klar zu sehen.
Ich hatte die DP nach Base64Encode durchsucht und diesen Beitrag gefunden.
Du dereferenzierst Memory, Matthias nicht.
Dieser Unterschied könnte über Erfolg und Misserfolg entscheiden.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Base64Encode funktioniert nicht

  Alt 20. Jan 2011, 13:02
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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#6

AW: Base64Encode funktioniert nicht

  Alt 20. Jan 2011, 14:23
Allerdings müsste seine Übergabe (ohne Dereferenzierung) falsch sein.
Ohne Dereferenzierung ist schon richtig:
Delphi-Quellcode:
var
  p: Pointer;
{...}
  p := tmp.Memory;
  Base64Encode(AStream.Memory, AStream.Size, p);
  Mit Zitat antworten Zitat
marabu

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

AW: Base64Encode funktioniert nicht

  Alt 21. Jan 2011, 08: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
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#8

AW: Base64Encode funktioniert nicht

  Alt 21. Jan 2011, 10:23
Base64Encode der zweite Paramaeter steht in EDX.
Richtig so:
Code:
  // load InSize (stored in EDX)
  mov EAX, InSize
Der Rückgabewert von Base64Decode wird nicht gesetzt, wenn ein leerer String übergeben wird.
Richtig so:
Code:
  mov EAX, InSize
  shr EAX, 2
  jz @@SuccessDone
Edit:
http://de.wikipedia.org/wiki/Base64:
Zitat:
In der Regel wird spätestens nach jeweils 76 ausgegebenen Zeichen, das entspricht 57 codierten Bytes, ein Zeilenumbruch eingefügt, welcher jedoch ansonsten für die Kodierung nicht von Belang ist.
Das wird in dieser Unit nicht berücksichtigt.

Geändert von Blup (21. Jan 2011 um 10:30 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz