Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Wie benutzt man Wolfgang Erhardts Base64 Unit? (https://www.delphipraxis.net/201357-wie-benutzt-man-wolfgang-erhardts-base64-unit.html)

DieDolly 15. Jul 2019 16:27


Wie benutzt man Wolfgang Erhardts Base64 Unit?
 
Ich komme mit den WE Units mal wieder nicht klar. Und ne, andere möchte ich nicht nutzen.
Wie enkodiert man einen String in Base64 mit den WE Units?
Der Funktionskopf
Delphi-Quellcode:
procedure EncodeBase64(psrc,pdest: pointer; lsrc,ldest: word; var LA: word);
  {-Base64 encode src to dest, LA result length of dest string}
Src habe ich. Dest scheint nur ein leerer PChar zu sein. lsrc also die Länge von Source habe ich auch. Aber woher soll ich die ldst Länge von dest wissen ?!

Das hier scheint eher nicht zu funktionieren
Delphi-Quellcode:
function Base64(const Text: PChar): string;
var
 Dest: PChar;
 L: Word;
begin
 EncodeBase64(Text, Dest, Length(Text), Length(Dest), L);
 Result := Dest;
end;

peterbelow 15. Jul 2019 16:52

AW: Wie benutzt man Wolfgang Erhardts Base64 Unit?
 
Zitat:

Zitat von DieDolly (Beitrag 1436784)
Ich komme mit den WE Units mal wieder nicht klar. Und ne, andere möchte ich nicht nutzen.
Wie enkodiert man einen String in Base64 mit den WE Units?
Der Funktionskopf
Delphi-Quellcode:
procedure EncodeBase64(psrc,pdest: pointer; lsrc,ldest: word; var LA: word);
  {-Base64 encode src to dest, LA result length of dest string}
Src habe ich. Dest scheint nur ein leerer PChar zu sein. lsrc also die Länge von Source habe ich auch. Aber woher soll ich die ldst Länge von dest wissen ?!

Das hier scheint eher nicht zu funktionieren
Delphi-Quellcode:
function Base64(const Text: PChar): string;
var
 Dest: PChar;
 L: Word;
begin
 EncodeBase64(Text, Dest, Length(Text), Length(Dest), L);
 Result := Dest;
end;

Du mußt der Routine den Speicher übergeben, den sie füllen soll, z. B.

Dest: String;
begin
SetLength(Dest, Lenght(Text)*3);
EncodeBase64(Test, @Dest[1]), length(text), length(dest), L);

L sagt Dir dann, wieviel des Dest-Puffers wirklich verwendet wurde.

Cave Unicode! Keine Ahnung ob die Bibliothek mit ANSI oder widechars arbeitet.

DieDolly 15. Jul 2019 16:59

AW: Wie benutzt man Wolfgang Erhardts Base64 Unit?
 
Delphi-Quellcode:
SetLength(Dest, Lenght(Text)*3);
Ist die Multiplikation mit 3 beabsichtigt und warum genau 3?

Zitat:

System.SetLength(Dest, Length(Text) * 3);
Zitat:

[dcc32 Fehler] E2197 Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden
Den Fehler hatte ich mit SetLength auch noch nie.

jottkaerr 15. Jul 2019 17:13

AW: Wie benutzt man Wolfgang Erhardts Base64 Unit?
 
Zitat:

Zitat von DieDolly (Beitrag 1436790)
Zitat:

System.SetLength(Dest, Length(Text) * 3);
Zitat:

[dcc32 Fehler] E2197 Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden
Den Fehler hatte ich mit SetLength auch noch nie.

Hast Du den Typ von Dest auf String geändert?

DieDolly 15. Jul 2019 17:15

AW: Wie benutzt man Wolfgang Erhardts Base64 Unit?
 
Ja aber da kommt nur Chinesisch am Ende bei raus.
Delphi-Quellcode:
// Text: string
var
 Dest: string;
 L: Word;
begin
 System.SetLength(Dest, Length(Text) * 3);
 EncodeBase64(@Text[1], @Dest[1], Length(Text), Length(Dest), L);

 Result := Dest;
end;
Aus ABD sollte eigentlich QUJD werden.

jottkaerr 15. Jul 2019 18:09

AW: Wie benutzt man Wolfgang Erhardts Base64 Unit?
 
Ist Text immer noch ein PChar? Dann kannst Du ihn direkt verwenden. Mit @Text[1] holst Du dir sonst einen Zeiger auf das zweite Zeichen.

Schokohase 15. Jul 2019 18:41

AW: Wie benutzt man Wolfgang Erhardts Base64 Unit?
 
Delphi-Quellcode:
function EncodeStringUtf8Base64(const Text: string): string;
var
  bufferIn: TArray<Byte>;
  outstr:AnsiString;
  Len: word;
begin
  // wir brauchen ein buffer mit bytes
  bufferIn := TEncoding.UTF8.GetBytes(Text);
  // die ausgabe erfolgt als ansistring
  SetLength(outstr, Length(bufferIn)*3);
  // aufruf der funktion
  base2n.EncodeBase64(@bufferIn[0], PAnsiChar(outstr), Length(bufferIn), Length(outstr), Len);
  // länge des outstr setzen
  SetLength(outstr, Len);
  // ausgabe als string
  Result := string(outstr);
end;
Nur so zur Info:

Mit Base64 werden binäre Daten (Bytes) in einem 7-bit ASCII-Text dargestellt (bzw. alle verwendeten Zeichen gehören in die Menge der 7-bit ASCII Zeichen).
Nicht mehr, nicht weniger.

p80286 15. Jul 2019 21:34

AW: Wie benutzt man Wolfgang Erhardts Base64 Unit?
 
Zu dem
Delphi-Quellcode:
setlength
:
Es werden 2 Eingabebytes in 3 Ausgabebytes umgesetzt darum sollte das eigentlich
Delphi-Quellcode:
outlength:=((length(instring)*sizeof(char)+1) shr 1) *3
lauten. Ausserdem ein String als Eingabe für binäre Daten ist freundlich formuliert fehlerträchtig.

Gruß
K-H

Neutral General 16. Jul 2019 10:44

AW: Wie benutzt man Wolfgang Erhardts Base64 Unit?
 
Du hast zwar gesagt du willst keine andere Unit nutzen... auch nicht die, die bei Delphi dabei ist?
Delphi-Quellcode:
uses
  System.NetEncoding;

var base64: String;
begin
  base64 := TNetEncoding.Base64.Encode(Text);
end;
Du brauchst keine externe Unit und die Funktionen sind einfach aufzurufen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:57 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